2014-10-05 11 views
15

In rand() considered harmful wird darauf hingewiesen, dass srand(time(NULL)) schlecht ist, weil srand ein unsigned int nimmt, aber für Compiler von Microsoft, time_t standardmäßig ist eine 64-Bit-Zahl, also geschieht eine Verengung Umwandlung. time_t ist jedoch implementierungsdefiniert.Ist Srand (Zeit (NULL)) schlecht?

Da ich sehe srand(time(NULL)) so weit verbreitet (auch auf dieser Website), sollte es entmutigt werden?

+1

Es gibt bessere Möglichkeiten der Randomisierung, warum nicht verwenden? –

+7

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. –

+0

Obwohl das stimmt, hat Boost bessere PRNGs, die in C++ 98 funktionieren. – chris

Antwort

10

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.

+2

Wenn '/ dev/urandom' nicht verfügbar ist, um Perlungen zu erraten und um Kollisionen zu vermeiden, mischt Perl die Prozess-ID, einen Stack-Zeiger und die Zeit (vorzugsweise Sekunden + Mikrosekunden von gettimeofday). http://perl5.git.perl.org/perl.git/blob/v5.20.1:/util.c#l4409 – Schwern