Bonjour, je voudrais savoir comment on génère des nombres aléatoires entre 0 et un nombre par exemple 20 avec la fonction RAND_MAX OUI AVEC gsl_rng_uniform (r) . ce que je dois taper dans l'algorithme,
merci
-----
Bonjour, je voudrais savoir comment on génère des nombres aléatoires entre 0 et un nombre par exemple 20 avec la fonction RAND_MAX OUI AVEC gsl_rng_uniform (r) . ce que je dois taper dans l'algorithme,
merci
RAND_MAX n'est pas une fonction, mais une constante prédéfinie. Pour générer un nombre (pseudo)aléatoire, c'est la fonction rand. Pour limiter à 20, il suffit de calculer le modulo 20 du nombre renvoyé par rand.
Mais tout çà est très bien expliqué et facilement trouvable sur le net.
Ah d'accord merci
C'est peut-être obsolète, mais certains nombres aléatoires ne sont pas très bon pour les bits de poids faible.
J'ai lu, jadis, dans la doc de rand() sous Unix qu'ils recommendaient d'utiliser "rand() * 20. /RAND_MAX" plutôt que "rand()%20"
Dans les deux cas, je ne vois pas ce qui te pose problème (à yuuuu, pas à Jack).
Bonjour,
Oui, et ça tient toujours.C'est peut-être obsolète, mais certains nombres aléatoires ne sont pas très bon pour les bits de poids faible.
J'ai lu, jadis, dans la doc de rand() sous Unix qu'ils recommendaient d'utiliser "rand() * 20. /RAND_MAX" plutôt que "rand()%20"
Dans les deux cas, je ne vois pas ce qui te pose problème (à yuuuu, pas à Jack).
Mais ça dépend de l'usage des nombres générés : si c'est plus ou moins "pour voir" ou "pour s"amuser" ou "pas critique", on peut s'en contenter.
La solution rand() * 20. /RAND_MAX restant préférable quand même.
Bonjour,
Ce sujet est un bonne occasion de tester le générateur que l'on utilise.
J'ai fait ce test, et avec mon générateur (Borland sous Windows), je n'ai pas trouvé de différence significative.
Ce serait intéressant de faire le même test avec d'autres générateurs, ou pourquoi pas appliquer les termes constants dans un autre environnement.
Le critère que j'utilise est le rapport EMQ/EMA = sqrt(pi/2) ~ 1.253
bonsoir
En effet, cette manière de générer un entier << partie entière de 20. * rand() / rand_max >> est préférable, simplement parce la méthode << rand() modulo 20 >> ne donne pas à coup sûr une répartition uniforme sur les entiers 0,1,...,19.
En effet, rand_max n'est pas forcément un multiple de 20 donc, avec la formule << rand() modulo 20 >>, les nombres les plus petits 0,1,..., auront une probabilité de sortie un poil plus élevée que les nombres 19,18,...
Pour le comprendre, faites comme si rand_max valait 50.
Bien-sûr, les discussions à propos de générateurs de nombres aléatoires ont toujours été une mine de contradictions.
Tant que l'on n'aura pas défini un protocole de vérification, toutes les hypothèses contradictoires sont possibles.
Je ne suis pas sûr que ces contradictions systématiques aident ceux qui essayent de s'y retrouver.
as-tu réalisé l'expérience que j'ai mentionnée ? Je ne pense pas, donc je répète ... :
Considère un nombre N tiré au hasard entre 0 et 50 , avec une probabilité identique pour chaque valeur possible (à savoir proba = 1/51).
Ensuite, calcule M = N modulo 20. Cet entier M est un entier compris entre 0 et 19.
Quelle est la probabilité d'avoir M = 0 ? celle d'avoir M = 19 ? tu constateras facilement que ce n'est pas la même.
Cette preuve mathématique fonctionne à l'identique pour une valeur rand_max plus grande que 50.
Il n'y a pas de contradiction, juste une preuve mathématique du phénomène banal que la méthode << rand() modulo 20 >> ne donne pas à coup sûr une répartition uniforme sur les entiers 0,1,...,19.
La démonstration est pertinente. C'est peut-être pour éviter ce genre de contradiction stérile que bon nombre de logiciels produisent un nombre entre 0 et 1.
Merci de souligner que l'argument n'est pas stérile puisque << bon nombre de générateurs produisent des nombres entre 0 et 1 >> afin d'éviter le problème de non uniformité évoqué ci-dessus.