2010-10-13 5 views
3

J'essaie de générer des nombres aléatoires avec une probabilité non uniforme simple pour imiter des données réalistes à des fins de test. Je suis à la recherche d'une fonction qui accepte mu et sigma comme paramètres et renvoie x où le x de certaines plages suit probablement une courbe en cloche standard, ou à peu près. Il n'a pas besoin d'être super précis ou même efficace. L'ensemble de données résultant n'a pas besoin de correspondre exactement au mu et au sigma que j'ai définis. Je cherche juste un générateur de nombres aléatoires non-uniforme relativement simple. Limiter l'ensemble des valeurs de retour possibles à ints serait bien. J'ai vu beaucoup de suggestions là-bas, mais aucune qui semble correspondre à ce cas simple.exemple d'algorithme pour générer une valeur aléatoire dans un ensemble de données avec une distribution normale?

+0

Il y a plusieurs questions existantes qui répondent à cette ... Je vais courir un ou plusieurs vers le bas bientôt. [Générer des nombres aléatoires suivant une distribution normale en C/C++] (http://stackoverflow.com/questions/2325472/), [Conversion d'une distribution uniforme en distribution normale] (http://stackoverflow.com/questions/75677) /), [C++: génère une distribution gaussienne] (http://stackoverflow.com/questions/1109446/) – dmckee

Répondre

3

Box-Muller transform en un mot:

Tout d'abord, obtenir deux nombres aléatoires indépendants, uniformes de l'intervalle (0, 1], les appeler U et V.

Ensuite, vous pouvez obtenir deux indépendants, UNIT- nombres aléatoires normaux distribués à partir des formules

X = sqrt(-2 * log(U)) * cos(2 * pi * V); 
Y = sqrt(-2 * log(U)) * sin(2 * pi * V); 

Cela vous donne IID nombres aléatoires pour mu = 0, sigma = 1; pour définir sigma = s, il faut multiplier vos nombres aléatoires par s, pour définir mu = m, ajouter m à vos nombres aléatoires

0

Ma première pensée est pourquoi ne pouvez-vous pas utiliser une bibliothèque existante? Je suis sûr que la plupart des langues ont déjà une bibliothèque pour générer des nombres aléatoires normaux.

Si pour une raison quelconque vous ne pouvez pas utiliser une bibliothèque existante, alors la méthode décrite par @ellisbben est assez simple à programmer. Une encore plus simple (approximatif) algorithme est juste pour résumer 12 nombres uniformes:

X = -6 ## We set X to be -mean value of 12 uniforms 
for i in 1 to 12: 
    X += U 

La valeur de X est approximativement normal. La figure suivante montre 10^5 tirages de cet algorithme par rapport à la distribution normale.

enter image description here

Questions connexes