Disons que l'intervalle de sortie du générateur soit [a; b] et celui que veut l'utilisateur est [x; y]. On peut utiliser le modulo à condition que :
* [a; b] soit plus grand (ou de même taille) que [x; y] : (b-a+1) >= (y-x+1)
* (b-a+1) soit multiple de (y-x+1)
Exemple : générateur : [0; 99] (100 nombres), utilisateur : [0; 9]. Si le générateur est uniforme, rand() % 10 sera aussi uniforme.
--
Hasard réutilise l'idée de l'algorithme de GSL, mais tire plusieurs nombres si l'intervalle du générateur est plus petit que celui de l'utilisateur. L'algorithme général est :
1. tirer un nombre au hasard
2. diviser ce nombre par un facteur (pour limiter le nombre d'itérations)
3. si le nombre est plus grand que ce que veut l'utilisateur, recommencer (retour en 1.)
[^] # Ne pas utiliser modulo
Posté par Victor STINNER (site web personnel) . En réponse au journal Hasard 0.8 : bibliothèque de génération des nombres aléatoires. Évalué à 2.
J'ai écrit ce document qui présente les erreurs courantes :
http://haypo.hachoir.org/hasard?file/tip/doc/common_errors.r(...)
Disons que l'intervalle de sortie du générateur soit [a; b] et celui que veut l'utilisateur est [x; y]. On peut utiliser le modulo à condition que :
* [a; b] soit plus grand (ou de même taille) que [x; y] : (b-a+1) >= (y-x+1)
* (b-a+1) soit multiple de (y-x+1)
Exemple : générateur : [0; 99] (100 nombres), utilisateur : [0; 9]. Si le générateur est uniforme, rand() % 10 sera aussi uniforme.
--
Hasard réutilise l'idée de l'algorithme de GSL, mais tire plusieurs nombres si l'intervalle du générateur est plus petit que celui de l'utilisateur. L'algorithme général est :
1. tirer un nombre au hasard
2. diviser ce nombre par un facteur (pour limiter le nombre d'itérations)
3. si le nombre est plus grand que ce que veut l'utilisateur, recommencer (retour en 1.)
Voir lib/randint.c pour les détails :
http://haypo.hachoir.org/hasard?file/tip/lib/randint.c
--
Autre document utile : présentations des implémentations de PRNG existantes, avec quelques bugs que j'ai noté :
http://haypo.hachoir.org/hasard?file/tip/doc/real_world.rst