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?
Antwort
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.
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.
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.
- 1. Soll ich den Zeiger std :: shared verwenden?
- 2. Sollte ich std :: set oder std :: unordered_set für eine Reihe von Zeigern verwenden?
- 3. Sollte ich std :: stringstream vorallokieren?
- 4. Parameter zu verwenden std :: größer oder std :: less als Argument
- 5. sollte std :: common_type std :: zerfallen?
- 6. Sollte ich std :: unique_ptr <T> in einer std :: vector Membervariable in meiner Klasse verwenden?
- 7. Ich kann nicht std :: vector von auto_ptr verwenden - sollte ich shared_ptr verwenden?
- 8. "Namespace Std {}" vor "Namespace Std verwenden;"
- 9. Wann std :: async vs. std :: threads verwenden?
- 10. Verwenden multidimensional std :: initializer_list
- 11. Wann sollte ich std :: convert :: From std :: convert :: Into implementieren?
- 12. Wie std :: signaling_nan verwenden?
- 13. Wann verwende ich std :: random_device?
- 14. Soll ich scipy.pi, numpy.pi oder math.pi verwenden?
- 15. Soll ich Dataset oder Datentabelle verwenden?
- 16. Soll ich pygame.event.get() oder pygame.event.poll() verwenden?
- 17. Soll ich System.out.println() oder etwas anderes verwenden?
- 18. Welchen soll ich verwenden? decimal.Add() oder "+"
- 19. Soll ich CouchDB oder SimpleDB verwenden?
- 20. Java: Soll ich Float oder Float verwenden?
- 21. Sollte ich() oder {} beim Weiterleiten von Argumenten verwenden?
- 22. Soll ich Prototypen verwenden oder nicht?
- 23. Verwenden Memberfunktion in std :: packaged_task
- 24. Soll ich Dockerfiles oder Image-Commits verwenden?
- 25. Sollte ich Phobos oder Tango verwenden?
- 26. Sollte ich std :: function by-value oder (rvalue) -reference übergeben?
- 27. C++ std :: mt19937 und rng Zustand speichern/laden und Portabilität
- 28. Sollte ich hier wakeFromNib oder initWithCoder verwenden?
- 29. Sollte ich DirectInput oder Windows-Nachrichtenschleife verwenden?
- 30. Soll ich Vererbung oder Zusammensetzung verwenden?
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
Ich bin gespannt, wenn man 'std :: default_random_engine' wählen sollte. Hat es einen Vorteil gegenüber 'std :: mt19937'? – Deqing