Mystère de rand() % 14 ne donnant que 6 ou 13
Un programmeur a rencontré un problème particulier où rand() % 14 est systématiquement renvoie seulement 6 ou 13 dans leur programme C. Malgré l'exécution du programme plusieurs fois, ces valeurs sont les résultats exclusifs.
Le code en question :
#include <iostream> #include <ctime> #include <cstdlib> using namespace std; int main(int argc, const char * argv[]) { srand(time(NULL)); cout << rand() % 14; return 0; }
Le coupable : le générateur de nombres aléatoires MCG d'Apple
Selon Wikipedia, le multiplicateur utilisé par le générateur de nombres aléatoires (RNG) Marsaglia-Crépeau d'Apple est 16807. Malheureusement, ce multiplicateur est divisible par 7. Par conséquent, le nombre aléatoire initial généré après srand() ne possède qu'un seul bit d'entropie modulo 14, le limitant à deux valeurs possibles : 6 ou 13.
A solution simple
Pour contourner ce problème, on peut supprimer quelques nombres aléatoires générés immédiatement après srand(). En faisant cela, l'entropie des nombres aléatoires suivants est augmentée, permettant une plage de valeurs plus large.
Voici le code modifié :
int main(int argc, const char * argv[]) { srand(time(NULL)); // Discard the first few random numbers to eliminate the bias for (int i = 0; i < 10; ++i) rand(); cout << rand() % 14; return 0; }
En supprimant les 10 premiers nombres aléatoires, vous éliminez efficacement le biais introduit par le multiplicateur défectueux du MCG RNG.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!