Das Geheimnis von rand() % 14, das nur 6 oder 13 ergibt
Ein Programmierer ist auf ein seltsames Problem gestoßen, bei dem rand() % 14 durchgängig ist gibt in ihrem C-Programm nur 6 oder 13 zurück. Obwohl das Programm mehrmals ausgeführt wurde, sind diese Werte die ausschließlichen Ergebnisse.
Der fragliche Code:
#include <iostream> #include <ctime> #include <cstdlib> using namespace std; int main(int argc, const char * argv[]) { srand(time(NULL)); cout << rand() % 14; return 0; }
Der Übeltäter: Apples MCG-Zufallszahlengenerator
Laut Wikipedia beträgt der von Apples Marsaglia-Crépeau-Zufallszahlengenerator (RNG) verwendete Multiplikator 16807. Leider ist dieser Multiplikator durch 7 teilbar. Folglich besitzt die nach srand() generierte anfängliche Zufallszahl nur ein Bit Entropie Modulo 14, was sie auf zwei mögliche Werte beschränkt: 6 oder 13.
Eine einfache Lösung
Um dieses Problem zu umgehen, kann man einige unmittelbar danach generierte Zufallszahlen verwerfen srand(). Dadurch wird die Entropie der nachfolgenden Zufallszahlen erhöht, was einen größeren Wertebereich ermöglicht.
Hier ist der geänderte Code:
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; }
Durch Verwerfen der ersten 10 Zufallszahlen, Sie beseitigen effektiv die Verzerrung, die durch den fehlerhaften Multiplikator des MCG RNG entsteht.
Das obige ist der detaillierte Inhalt vonWarum gibt „rand() % 14' auf Apple-Systemen nur 6 oder 13 zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!