Heim > Backend-Entwicklung > C++ > Warum führt „rand() % 14' zu uneinheitlichen Ergebnissen?

Warum führt „rand() % 14' zu uneinheitlichen Ergebnissen?

Patricia Arquette
Freigeben: 2024-12-03 05:46:09
Original
962 Leute haben es durchsucht

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

Rand() % 14 generiert ungleichmäßige Werte

Beim Versuch, Zufallswerte innerhalb eines bestimmten Bereichs zu generieren, kann es bei einigen Programmierern zu Problemen kommen ungewöhnliches Verhalten bei Verwendung der Funktion rand(). Ein häufig gemeldetes Problem ist, dass rand() % 14 durchweg Werte von 6 oder 13 zurückgibt.

Um dieses Phänomen zu verstehen, ist es wichtig, sich mit dem zugrunde liegenden Algorithmus von rand() zu befassen. Die spezifische Implementierung, die auf den Maschinen von Apple verwendet wird, basiert auf dem Multiply-with-Carry (MWC) Generator. Eine Schwäche dieses Generators ist leider seine Teilbarkeit durch 7, insbesondere der Multiplikatorwert von 16807.

Daher sind die niederwertigen Bits der ersten paar Zufallszahlen, die unmittelbar nach der Initialisierung von srand() generiert werden, begrenzt Entropie. Im Fall von rand() % 14 hat das niederwertige Bit immer einen identischen Wert, was nur zu zwei möglichen Ergebnissen führt: 6 oder 13.

Um dieses Problem zu mildern, besteht eine einfache Lösung darin, es zu verwerfen die ersten Zufallszahlen, die nach der Initialisierung generiert werden. Durch den mehrmaligen Aufruf von rand() ohne Verwendung der Ergebnisse wird der interne Zustand des Algorithmus chaotischer und die gleichmäßige Werteverteilung wird wiederhergestellt.

Das obige ist der detaillierte Inhalt vonWarum führt „rand() % 14' zu uneinheitlichen Ergebnissen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage