2015-05-14 6 views
10

wenn ich mit std :: random Zufallszahlen erzeugen will, welche Engine sollte ich bevorzugen? die std::default_random_engine oder die std::mt19937? Was sind die Unterschiede?Soll ich std :: default_random_engine verwenden oder sollte ich std :: mt19937 verwenden?

+1

Konsultieren Sie die Dokumentation. Die Wahl des Zufallszahlengenerators hängt von Ihrer speziellen Situation ab. Allerdings ist der Mersenne Twister oft ein guter Ausgangspunkt. – Bathsheba

+0

Ich bin gespannt, wenn man 'std :: default_random_engine' wählen sollte. Hat es einen Vorteil gegenüber 'std :: mt19937'? – Deqing

Antwort

10

Für leichte Randomnes (z. B. Spiele) könnten Sie sicherlich default_random_engine betrachten. Aber wenn Ihr Code stark auf die Qualität der Zufälligkeit (zB Simulationssoftware) abhängig ist, sollten Sie es nicht verwenden, da es nur minimalistisch Erfolgs- Garantie gibt:

Es ist die Bibliothek UMSETZUNG der Auswahl eines Generators, der mindestens liefert annehmbares Motorverhalten für relativ zufällig, unerfahren, und/oder leichte Verwendung.

Die mt19937 32 Bits mersene Twister (oder sein 64-Bit-Gegenstück mt19937_64) auf der anderen Seite ist eine, die sehr gut well known algorithmstatistical randomness tests gibt. Es ist also ideal für wissenschaftliche Anwendungen.

Sie sollten jedoch keines von beiden berücksichtigen, wenn Ihre Zufallszahlen für den Zweck security (z. B. kryptografisch) bestimmt sind.

3

Die Frage hat derzeit eine enge Abstimmung als primäre Meinung basiert. Ich würde dagegen argumentieren und sagen, dass std::default_random_engine objektiv eine schlechte Wahl ist, da Sie nicht wissen, was Sie bekommen und das Wechseln von Standardbibliotheken kann Ihnen unterschiedliche Ergebnisse in der Qualität der Zufälligkeit geben, die Sie erhalten.

Sie sollten wählen, was auch immer Zufallszahlengenerator Ihnen die Art von Qualitäten, die Sie suchen, gibt. Wenn Sie zwischen den beiden wählen müssen, gehen Sie mit std::mt19937, da es vorhersagbares und definiertes Verhalten gibt.

1

Sie richten sich an unterschiedliche Bedürfnisse. Der erste ist ein implementierungsdefinierter Alias ​​für einen bestimmten Generator, während der zweite den Mersenne-Twister-Algorithmus mit einem 32-Bit-Seed verwendet.

Wenn Sie keine besonderen Anforderungen haben, sollte std::default_random_engine in Ordnung sein.

Verwandte Themen