Heim > Backend-Entwicklung > C++ > Ist die neue Zufallsbibliothek wirklich besser als „std::rand()'?

Ist die neue Zufallsbibliothek wirklich besser als „std::rand()'?

Susan Sarandon
Freigeben: 2024-10-31 07:03:30
Original
571 Leute haben es durchsucht

Is the New Random Library Really Better Than `std::rand()`?

Warum ist die neue Zufallsbibliothek besser als std::rand()?

Im berühmten Vortrag „rand() Considered Harmful“ unter Verwendung der Engine-Distribution Das Paradigma für die Generierung von Zufallszahlen wird gegenüber der klassischen std::rand() plus Modul-Vereinfachung befürwortet.

Um die aufgestellten Behauptungen zu testen, wurde ein Experiment durchgeführt, bei dem std::rand() mit std::mt19937 plus std:: verglichen wurde. uniform_int_distribution wurde durchgeführt:

  1. Zwei Funktionen, getRandNum_Old und getRandNum_New, wurden für die Generierung von Zufallszahlen zwischen 0 und 5 mit den beiden Methoden entwickelt.
  2. 960.000 Zufallszahlen wurden mit beiden Ansätzen generiert , und die Häufigkeiten der Zahlen 0-5 wurden gezählt.
  3. Die Standardabweichungen der Häufigkeiten wurden für 1000 Simulationen berechnet.
  4. Die für beide Methoden benötigte Zeit wurde ebenfalls aufgezeichnet.

Überraschenderweise war die Gesamtverteilung der Rollen bei beiden Methoden gleich, was darauf hindeutet, dass std::mt19937 plus std::uniform_int_distribution keine zusätzliche Einheitlichkeit lieferte. Allerdings war die neue Methode ungefähr viermal langsamer.

Obwohl dieses Experiment darauf hinzudeuten schien, dass std::rand() nicht unbedingt minderwertig ist, ist es wichtig, die inhärenten Einschränkungen von std::rand() zu berücksichtigen:

  • Es verwendet einen linearen Kongruenzgenerator (LCG), der bekanntermaßen bestimmte Schwächen aufweist, wie z. B. eine geringe Zufälligkeit von Bits niedriger Ordnung, eine kurze Periode und einen begrenzten RAND_MAX.
  • Der Die srand-Schnittstelle begrenzt die Anzahl der Start-Seeds (und damit der generierten Sequenzen), da sie ein vorzeichenloses int akzeptiert.

Im Gegensatz dazu ist das neue Header in der C-Standardbibliothek:

  • Bietet vollständig spezifizierte Algorithmen mit garantierten Eigenschaften.
  • Kapselt Generatoren in Klassen und eliminiert globale Status- und damit verbundene Probleme.
  • Enthält a Standardmäßiges random_device für das Seeding.
  • Ermöglicht bei Bedarf die Implementierung benutzerdefinierter Generatoren.

In Bezug auf die Leistung wird empfohlen, dass std::minstd_rand ein geeigneter Ersatz für std sein könnte ::mt19937, wenn die LCG-Qualität ausreichend ist und möglicherweise eine bessere Geschwindigkeit bietet (insbesondere, wenn die Verteilungsanpassung mithilfe von uniform_int_distribution vermieden wird).

Letztendlich hängt die Wahl des Zufallszahlengenerators von den spezifischen Anforderungen der Anwendung ab, aber das Neue Die Bibliothek bietet mehrere Vorteile gegenüber der alten std::rand()-Implementierung, insbesondere für Anwendungen, die hochwertige Zufallszahlen erfordern.

Das obige ist der detaillierte Inhalt vonIst die neue Zufallsbibliothek wirklich besser als „std::rand()'?. 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