Bonjour à tous,
J'ai voulu effectuer quelques tests sur la génération de nombres pseudo-aléatoires en C.
J'ai testé différentes méthodes :
Les deux premières sont très connues, je les appelles respectivement méthode 1 et méthode 2 :La troisième, que j'ai trouvée sur la FAQ, est sensée éviter certains défauts contenus dans les deux premières méthodes qui génèrent certains nombres de façon non aléatoire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 /* on genere un nombre entre 0 et N */ int methode_1 = rand() % (N+1); int methode_2 = (int)(rand() / (double)RAND_MAX * (N+1);Le but de mes tests était de trouver laquelle de ces trois méthodes se rapprochait le plus de la situation d'équiprobabilité (un nombre a autant de chances qu'un autre de sortir).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 /* methode 3 */ int alea(int n) { int partSize = (n == RAND_MAX) ? 1 : 1 + (RAND_MAX - n)/(n+1); int maxUsefull = partSize * n + (partSize-1); int draw; do { draw = rand(); } while (draw > maxUsefull); return draw/partSize; }
Voici comment je procède :
Je choisis un nombre N (par exemple 9), les nombres tirés seront compris entre 0 et 9.
Avec chaque méthode, je fais un grand nombre de tirages (10 000, 1M, ...), et je compte les occurences de chaque nombre généré.
Je calcule ensuite la fréquence d'apparition de chaque nombre.
Je calcule le total des écarts (que j'appelle d) entre les fréquences d'apparition des nombres et la fréquence d'apparition parfaite (exemple, avec N = 9 et 10 000 tirages, la fréquence parfaite est de 10/10 000 = 1.0E-03)
La meilleure méthode est celle qui donne un nombre d le plus petit, car elle s'approche le plus de la situation d'équiprobabilité.
Pour ne pas me focaliser sur un résultat, j'effectue mille fois ce test, et je compte le nombre de fois que la méthode 1 avait le d le plus petit, idem pour la méthode 2 et 3.
C'est ces résultats qui m'ont surpris : aucune des trois méthodes n'offre un écart certain par rapport aux deux autres. Si j'avais eux sur 1000 tests la "méthode 3" 900 fois gagnante, j'aurais conclu qu'elle est réellement plus efficace. Mais les résultats ne montrent pas qu'une méthode est meilleure que l'autre.
Qu'en pensez-vous ? Avez-vous déjà effectué des tests similaires ?
Peut-être ma méthode de test n'est pas bonne ? (Je veux parler de la méthode en elle même, car je suis sûr de mon code, j'ai fait des vérifications à la calculette sur les tests).
Merci
Partager