Tu fais allusion à la méthode de Box-Muller :
- On tire DEUX nombres aléatoires de distribution uniforme dans l'intervalle [-1, 1],
p.ex
dans Excel, la fonction ALEA() renvoie un nombre pris au hasard dans une distribution uniforme dans [0, 1[. En C, il y a la fonction rand(). Il faut d'abord faire une changement de variable pour la ramener dans [-1, +1]
x = 2*ALEA() -1
y = 2*ALEA() -1
- On calcule le pseudo-rayon associé
s = x² + y²
si s est plus grand que 1, on jette l'essai et on reprend le processus au début.
- On calcule deux variables aléatoires dérivées
w = x·√[ -2 ln(s) / s]
z = y·√[-2 ln(s) / s]
Les variables aléatoires w et z sont distribuées normalement avec une moyenne 0 et un écart-type unitaire. ( Si on n'a besoin que d'une variable, on peut jeter l'autre , sinon, on peut se sservir des deux car elles ne sont absolument pas corrélées).
Personnellement je préfère utiliser le fait qu'une somme de variables de distribution uniforme tend vers une distribution normale.
x1= ALEA()
x2= ALEA()
:
xN= ALEA()
z = (x1+x2+...+xN) - N/2
z est une distribution normale centrée sur 0
Il faut encore corriger (multiplier) par un facteur f pour que l'écart type soit unitaire mais je n'ai pas la formule sous la main (de type f = k/racine(N))
Ce n'est toutefois pas difficile à retrouver puisque
( variance de la somme ) = N * (variance de la distribution uniforme)
Cette méthode est beaucoup plus rapide quand il faut tirer un grand nombre de variable car elle n'utilise ni ln ni racine carrée ( racine(N) est une constante)
A partir de N=4 il n'est plus possible de trouver un écart significatif avec la loi normale
---------------
@arrial
Tout à fait d'accord avec toi
La fonction ALEA() n'est citée qu'à titre d'exemple afin de permettre un test rapide