Maison >développement back-end >C++ >Pourquoi `rand() % 14` produit-il des résultats non uniformes ?

Pourquoi `rand() % 14` produit-il des résultats non uniformes ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-03 05:46:09958parcourir

Why Does `rand() % 14` Produce Non-Uniform Results?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn