Générer des nombres aléatoires en fonction des distributions
Je veux générer des nombres aléatoires selon certaines distributions. Comment puis-je faire cela?
source d'informationauteur Nilani Algiriyage
Vous devez vous connecter pour publier un commentaire.
La norme générateur de nombre aléatoire vous avez (
rand()
dans C après une transformation simple, les équivalents dans de nombreuses langues) est une assez bonne approximation d'une distribution uniforme sur l'intervalle [0,1]. Si c'est ce que vous avez besoin, vous avez terminé. C'est aussi trivial que convertir un nombre aléatoire généré plus de un peu plus grand intervalle entier.Conversion d'une distribution Uniforme à une distribution Normale a déjà été traitées de SORTEcomme aller à la Distribution exponentielle.
[EDIT]: Pour la distribution triangulairela conversion d'une variable uniforme est relativement simple (dans C):
C'est juste la conversion de la formule donnée sur la page Wikipedia. Si vous voulez que les autres, c'est l'endroit pour commencer la recherche; en général, vous devez utiliser la variable uniforme de choisir un point sur l'axe vertical de la fonction de densité cumulative de la distribution que vous voulez (en supposant que c'est en continu), et inverser la CDF pour obtenir la valeur aléatoire avec la distribution désirée.
La bonne façon de le faire est de décomposer la distribution en n-1 distributions binaires. C'est si vous avez une distribution comme ceci:
Vous transformer en 4 distributions binaires:
Sélectionner de manière uniforme à partir de la n-1 distributions, puis sélectionner la première ou la deuxième symbole basés sur la probabilité que si chacun dans la distribution binaire.
Code pour c'est ici
Il dépend en réalité de la distribution. La manière la plus générale est la suivante. Soit P(X) est la probabilité que le nombre aléatoire généré en fonction de votre distribution est inférieur à X.
Vous commencez avec la génération aléatoire uniforme X compris entre zéro et un. Après que vous trouver Y tel que P(Y) = X et la sortie Y. Vous pouvez trouver ces Y en utilisant la recherche binaire (puisque P(X) est une fonction croissante de X).
Ce n'est pas très efficace, mais il fonctionne pour les distributions où P(X) peut être efficacement calculée.
Vous pouvez consulter la transformation inverse de l'échantillonnage, le rejet de l'échantillonnage ainsi que le livre de Devroye "Non uniforme aléatoire de la variable aléatoire de la génération"/Springer Verlag, 1986
Vous pouvez convertir les discrètes les bacs à float/double avec interpolation. Linéaire Simple qui fonctionne bien. Si votre table de la mémoire est contraint d'autres méthodes d'interpolation peut être utilisé. -pam