Quel est l’algorithme correct pour effectuer un tirage aléatoire suivant une distribution aléatoire uniforme hypersphèrique ? Pas si évident...
La première solution venant à l’esprit consiste a se placer dans un espace en coordonnées polaires et à tirer dans une loi uniforme chaque coordonnées. Dans un espace à N dimensions, on tire ainsi le rayon r et les angles a1...a2...ai...aN. Puis on passe en coordonnées rectangulaires pour avoir les les angles x1...x2...xi...xN.
Or, comme on peut le voir sur la figure, la distribution n’est pas franchement uniforme.
La bonne solution consiste à calculer chaque xi de cette façon :
xi=(r1/Niai)/sqrt(sum(ai))
(en LATEX :
$x_{i}=\frac{r^{\frac{1}{N}}_i\cdot a_{i}}{\sqrt{{\displaystyle \sum _{j=1}^{N}a_{i}}}}$)
avec ri tiré dans U0,1 et ai tiré dans NO,1.
La répartition des points est ici correcte.
Dans l’archive ci-jointe vous trouverez le code source C++ du programme ainsi qu’un éxécutable pour Linux (cela dit la compilation sous Windows devrait se faire sans aucun problèmes).