Da ich srand (Zeit (NULL)) so weit verbreitet (auch auf dieser Website), sollte es entmutigt werden?
Es hängt davon ab, wie Sie die Ausgabe von Ihrem Generator (in diesem Fall die Ausgabe von rand()
) verwenden möchten.
Wenn Sie nur eine einheitliche Verteilung für einzelne Läufe Ihres Programms benötigen, dann ist srand(time(NULL))
in Ordnung. Dies wäre in einer Simulation akzeptabel, in der Sie nur eine gleichmäßige Verteilung der Zahlen benötigen.
Wenn Sie einen Stapeljob senden möchten, sodass mehrere Instanzen Ihres Programms gleichzeitig ausgeführt werden (und effektiv gleichzeitig gestartet werden), führt srand(time(NULL))
wahrscheinlich dazu, dass eine oder mehrere Instanzen denselben zufälligen Stream produzieren .
Wenn Sie eine sichere Ausgabe benötigen, dann sollten Sie nicht verwenden, da es oft ein Linear Congruential Generator (LCG) ist. Joan Boyar hat uns vor Jahren beigebracht, wie man sie bricht. Siehe Inferring sequences produced by a linear congruential generator missing low-order bits.
Was das Problem mit time_t
, nur falten das Argument von srand
erwartet passen, wenn time_t
zu groß ist. Sie können sogar die Prozess-PID einklappen, damit Batch-Simulationsjobs wie gewünscht funktionieren.
Es gibt bessere Möglichkeiten der Randomisierung, warum nicht verwenden? –
Es ist das Beste, was Sie in C oder sogar in C++ 98/03 tun können. C++ 11 fügte einen neuen "" Header mit neuen Zufallszahlenerzeugungsfähigkeiten hinzu, um die Situation wesentlich zu verbessern. –
Obwohl das stimmt, hat Boost bessere PRNGs, die in C++ 98 funktionieren. – chris