std::random_device mehrfach definieren
-
Ich möchte in meinem Programm an mehreren Stellen
std::random_device
verwenden, um Zufallszahlen zu erzeugen. Ist es ein Problemstd::random_device
mehrfach zu definieren, d.h. leidet die Qualität der Zufallszahlen darunter (wie wenn mansrand
mehrfach aufruft)? Gemäss meinem Verständnis vonstd::random_device
sollte das kein Problem sein aber da ich mir nicht ganz sicher bin frage ich lieber nach.Ganz konkrekt: Generiert
int rand_num() { std::random_device rd; // Use rd here }
schlechtere Zufallszahlen als
std::random_device rd; int rand_num() { // Use rd here }
?
-
AFAIK sollte man random_device sparsam einsetzten, da es die Zahlen aus entsprechender Hardware ziehen soll, die irgendwann "alle" ist. Stattdessen sollte man mit einer generierten Zahl z.B. einen mt19937 Generator initialisieren.
Siehe den Kommentar im Beispielprogramm http://en.cppreference.com/w/cpp/numeric/random/random_device
-
Das dürfte egal sein, trotzdem würde ich das nicht so machen, random_device ist nämlich scheiße langsam.
-
Danke für die Antworten
Kennt jemand ein Tutorial oder einen Artikel, der ausführlich Zufallszahlengenerierung in C++11 behandelt? Ich habe schon ein paar Dinge gefunden aber die wirken etwas oberflächlich.
-
Rand considered harmful ist ganz nett.
-
Die Initialisierung von std::random_device ist verglichen mit dem Mersenne-Twister zeitlich teuer und sollte vermieden werden, wenn man auf Performance achtet. std::random_device sollte man nur benutzen, wenn man z.B. kryptografisch sichere Zufallszahlen braucht (was der std::mt19937 nicht bietet).
-
Jodocus schrieb:
Die Initialisierung von std::random_device ist verglichen mit dem Mersenne-Twister zeitlich teuer und sollte vermieden werden, wenn man auf Performance achtet. std::random_device sollte man nur benutzen, wenn man z.B. kryptografisch sichere Zufallszahlen braucht (was der std::mt19937 nicht bietet).
Der mt19937 ist kryptographisch praktisch immer hinreichend sicher, wenn der Seed zufällig war.
random_device öffnet die Datei /dev/urandom, man muss sich entscheiden ob man das lieber die ganze Zeit offen haben will oder nur immer nur kurz um einen guten Seed zu erhalten. Die Qualität leidet jedenfalls nicht darunter, random_device mehrfach zu initialisieren. Weil die Stelle oft auch nicht performancekritisch ist, ist es eigentlich egal, random_device immer neu zu erstellen.
-
nuhr schrieb:
Jodocus schrieb:
Die Initialisierung von std::random_device ist verglichen mit dem Mersenne-Twister zeitlich teuer und sollte vermieden werden, wenn man auf Performance achtet. std::random_device sollte man nur benutzen, wenn man z.B. kryptografisch sichere Zufallszahlen braucht (was der std::mt19937 nicht bietet).
Der mt19937 ist kryptographisch praktisch immer hinreichend sicher, wenn der Seed zufällig war.
Bei dem Nickname sollte man sich in acht nehmen, nicht über Themen zu schreiben, von denen man keine Ahnung hat.
-
Jodocus schrieb:
std::random_device sollte man nur benutzen, wenn man z.B. kryptografisch sichere Zufallszahlen braucht (was der std::mt19937 nicht bietet).
Bitte nicht! Die Implementierung mag auf einigen Systemen vielleicht dafür ausreichend sein, aber nichts davon ist garantiert. Wenn ihr kryptografisch sichere Zufallszahlen braucht, fragt den User! Lasst ihn etwas mit der Maus rumfahren oder seine Tastatur ein paar mal facerollen, und nutzt das dann als Seed für einen csprng.
nuhr schrieb:
Der mt19937 ist kryptographisch praktisch immer hinreichend sicher, wenn der Seed zufällig war.
LOL