Maison >développement back-end >C++ >Pourquoi `rand() % 14` produit-il des résultats non uniformes ?
Rand() % 14 génère des valeurs non uniformes
Dans le but de générer des valeurs aléatoires dans une plage spécifique, certains programmeurs peuvent rencontrer comportement inhabituel lors de l'utilisation de la fonction rand(). Un problème courant signalé est que rand() % 14 renvoie systématiquement des valeurs de 6 ou 13.
Pour comprendre ce phénomène, il est crucial de se plonger dans l'algorithme sous-jacent de rand(). L'implémentation spécifique utilisée sur les machines Apple est basée sur le générateur Multiply-with-Carry (MWC). Malheureusement, une faiblesse de ce générateur est sa divisibilité par 7, en particulier la valeur multiplicatrice de 16807.
En conséquence, les bits de poids faible des premiers nombres aléatoires générés immédiatement après l'initialisation de srand() ont un nombre limité de bits. entropie. Dans le cas de rand() % 14, le bit de poids faible aura toujours une valeur identique, conduisant à seulement deux résultats possibles : 6 ou 13.
Pour atténuer ce problème, une solution simple consiste à supprimer les premiers nombres aléatoires générés après l'initialisation. En invoquant rand() plusieurs fois supplémentaires sans utiliser les résultats, l'état interne de l'algorithme devient plus chaotique et la distribution uniforme des valeurs est restaurée.
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!