Heim > Backend-Entwicklung > C++ > Warum gibt „rand() % 14' auf Apple-Systemen nur 6 oder 13 zurück?

Warum gibt „rand() % 14' auf Apple-Systemen nur 6 oder 13 zurück?

Susan Sarandon
Freigeben: 2024-11-24 20:59:21
Original
826 Leute haben es durchsucht

Why Does `rand() % 14` Only Return 6 or 13 on Apple Systems?

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;
}
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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!

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