|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
![]() ![]() Inscription : juin 2006 Messages : 6 935 ![]() |
Bonjour,
Il peut parfois arriver que l'on ait besoin de générer aléatoirement des nombres aléatoires suivant une loi gaussienne, je fais donner l'algorithme basé sur la technique de Box-Muller. Tout d'abord, on suppose que l'on dispose d'une fonction Aleatoire0-1 permettant de générer aléatoirement des réels entre 0 et 1 strictement. (par exemple Math.random de Java si je ne m'abuse). Si vous ne disposez pas d'une telle fonction, alors vous disposez surement d'une fonction (du genre rand) qui permet de générer un entier aléatoire quelconque. Pour simuler la fonction Aleatoire0-1, il est possible d'écrire : Code :
Code :
L'implémentation de Java propose le code suivant (on en parle après) (code sous licence GPL) : Code :
__________________
Je ne répondrai à aucune question technique en privé |
||||||
|
|
00
|
|
|
#2 | ||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 819 ![]() |
Pour les java-fan-boys, la classe Random permet de generer une valeur aléatoire gaussienne de moyenne (mean) 0 et d'ecart-type (sigma) 1.0
Code :
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||
|
00
|
|
|
#3 |
![]() ![]() Romuald PerrotAttaché Temporaire d'Enseignement et de Recherche (ATER) Inscription : avril 2005 Messages : 4 146 ![]() |
__________________
http://rperrot.developpez.com http://phos-graphein.fr Vous désirez contribuer à la rubrique algorithmique, n'hésitez pas à me contacter. |
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : novembre 2005 Messages : 4 970 ![]() |
Promu@Id, l'algo de Mersenne-Twister permet de generer une sequence uniformement repartie, le sujet ici est d'en faire une sequence repartie suivant une loi gaussienne.
millie, j'ai une question et une suggestion. La question, est-ce que les bornes 0 et 1 doivent pouvoir etre generee (auquel cas, il vaut mieux preciser la maniere doit ln(0) doit etre gere)? La suggestion, enlever la constante 65001 et la remplacer par RAND_MAX ou RAND_MAX+1 suivant la reponse a la question precedente. Utiliser autre chose qu'un diviseur de RAND_MAX+1 introduit un biais d'autant plus important que ce nombre est grand (c'est particulierement visible quand le nombre est plus grand, comme ce le sera pour les distraits utilisant une implementation de C ou RAND_MAX vaut 32767)
__________________
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça. |
|
|
00
|
|
|
#5 | |
![]() ![]() Inscription : juin 2006 Messages : 6 935 ![]() |
Citation:
L'utilisation de RAND_MAX doit effectivement être beaucoup plus efficace. Je ne connaissais pas, je l'utiliserai donc Je suis également tombé sur d'autres algorithmes à cette page : http://www.taygeta.com/random/gaussian.html (il génère deux nombres aléatoires d'un coup). Mais il faut gérer un cas particulier qui n'est pas décrit dans l'algorithme.
__________________
Je ne répondrai à aucune question technique en privé |
|
|
|
00
|
|
|
#6 | |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 819 ![]() |
Citation:
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
|
00
|
|
|
#7 |
![]() ![]() Inscription : juin 2006 Messages : 6 935 ![]() |
Cet algorithme est peut être moins en carton que le mien
Je ferais quelques tests pour voir la repartition...Par contre, il est possible de sortir de la boucle avec s =0, et ils font : Math.log(s)/s, et ils ne font pas de cas particulir juste pour s = 0. A moins que java sache gérer la forme particulière ln x /x en 0
__________________
Je ne répondrai à aucune question technique en privé |
|
|
00
|
|
|
#8 | |||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 819 ![]() |
Citation:
Citation:
Citation:
Au mieux la valeur sera Nan (not a number)
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|||
|
00
|
|
|
#9 |
![]() ![]() Inscription : juin 2006 Messages : 6 935 ![]() |
Ah oui quel boulet
. Je sais pas pourquoi je pensais le contraire.
__________________
Je ne répondrai à aucune question technique en privé |
|
|
00
|
|
|
#10 | ||||||
![]() ![]() Inscription : juin 2006 Messages : 6 935 ![]() |
Donc, avec ma méthode de base, voici deux exemples de répartitions, pardonnez moi l'ASCIIART
Code :
En utilisant le conseil de Jean Marc (à savoir utiliser RAND_MAX (rand()/(RAND_MAX+1.0f) pour générer un flottant entre 0 et 1) On obtient ce genre de répartition : Code :
Et en utilisant la méthode Polaire de Box-Muller implémenté par Java, on obtient ce genre de répartition : Code :
Donc voilà
__________________
Je ne répondrai à aucune question technique en privé |
||||||
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() alilou Étudiant Inscription : juin 2011 Messages : 1 ![]() |
j'ai une question:
comment générer des distrubutions non uniformes , sachant que le systéme ne fournit que des générateurs unifrmes ? |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com