Warum ist die neue Zufallsbibliothek besser als rand()?
Aktuelle Bedenken bezüglich rand() haben Diskussionen über die Verwendung überlegener Zufallszahlen ausgelöst Generierungsprozeduren (RNG) basierend auf dem Engine-Distribution-Paradigma, im Gegensatz zum herkömmlichen std::rand()- und Modulo-Ansatz. Um die Mängel von rand() aus erster Hand zu verstehen, wurde ein kurzes Experiment durchgeführt.
Zwei Funktionen wurden erstellt, getRandNum_Old() und getRandNum_New(), die std::rand() und std nutzen: :mt19937 mit std::uniform_int_distribution, um Zufallszahlen zwischen 0 und 5 zu generieren. Mit jeder Methode wurden 960.000 Zufallszahlen generiert und die Häufigkeit jeder Zahl (0-5) aufgezeichnet. Als Maß diente die Standardabweichung, wobei ein niedrigerer Wert auf eine gleichmäßigere Verteilung hinweist. Der Vorgang wurde 1000 Mal wiederholt und die für jede Iteration benötigte Zeit gemessen.
Überraschenderweise war die Rollenverteilung bei beiden Methoden ähnlich. Die neue Methode war etwa viermal langsamer. Es schien, dass der Geschwindigkeitsgewinn mit einer minimalen Qualitätsverbesserung einherging.
Ein entscheidender Unterschied liegt jedoch in der RNG-Implementierung selbst. Viele rand()-Implementierungen verwenden lineare kongruente Generatoren (LCGs), die im Allgemeinen nicht die robustesten sind. Trotz ihrer Verbreitung liefern sie in der Regel akzeptable Ergebnisse in grundlegenden Tests wie dem durchgeführten.
Zu den Mängeln unterdurchschnittlicher rand()-Implementierungen gehören eine geringe Zufälligkeit in Bits niedriger Ordnung, kurze Perioden, ein niedriger RAND_MAX und eine Korrelation zwischen aufeinanderfolgenden Extraktionen. Es ist jedoch wichtig zu beachten, dass diese Einschränkungen nicht der rand()-API eigen sind.
Das zugrunde liegende Problem mit rand() konzentriert sich auf:
Das neue
Leistungsmäßig std::mt19937 ( von std::rand() in Ihrem Test verwendet) ist langsamer als std::minstd_rand (ein LCG, das auch in der
Das obige ist der detaillierte Inhalt vonWarum wird die „Bibliothek in C' gegenüber „rand()' bevorzugt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!