Heim > Backend-Entwicklung > C++ > Warum wird die „Bibliothek in C' gegenüber „rand()' bevorzugt?

Warum wird die „Bibliothek in C' gegenüber „rand()' bevorzugt?

DDD
Freigeben: 2024-11-03 17:00:03
Original
186 Leute haben es durchsucht

Why is the `` library in C   preferred over `rand()`?

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:

  1. Abwärtskompatibilität: Eine Änderung bestehender Implementierungen würde die Reproduzierbarkeit in Programmen beeinträchtigen, die auf srand mit einem festen Startwert basieren.
  2. Einfache Schnittstelle: rand() stellt einen einzigen, globalen Generator bereit. Obwohl es für grundlegende Anwendungsfälle geeignet ist, stellt es Herausforderungen in Multithread-Anwendungen und Szenarien dar, die reproduzierbare Sequenzen erfordern.

Das neue Die Bibliothek geht auf diese Bedenken ein, indem sie Folgendes bietet:

  • Spezifizierte Implementierungen: Compiler-übergreifend reproduzierbare Ausgabe und garantierte Eigenschaften.
  • Auf dem neuesten Stand der Technik Generatoren: In Klassen gekapselt, um globale Zustandsprobleme zu vermeiden.
  • Zufälliges Gerät: Seeding-Funktionen.

Leistungsmäßig std::mt19937 ( von std::rand() in Ihrem Test verwendet) ist langsamer als std::minstd_rand (ein LCG, das auch in der -Bibliothek verfügbar ist). Durch die Verwendung von std::minstd_rand mit einer ähnlichen Implementierung wie getRandNum_Old() kann eine schnellere Ausführung erreicht werden (6 ms im Vergleich zu 8,61 ms für rand()).

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage