2013-04-06 23 views
6

Die Art, wie ich gelernt habe, war, zunächst den Zufallszahlengenerator mit srand(time(NULL)) zu säen und dann Aufrufe an rand() zu verwenden, um Zufallszahlen zu generieren. Das Problem mit diesem Ansatz ist, wenn ich mein Programm mehrmals in der gleichen Sekunde laufen lasse, sind die erzeugten Zufallszahlen immer gleich. Was ist ein guter Weg?Was ist der beste Weg, um srand() zu säen?

+0

Sie könnten auf eine systemspezifische Methode für mehr Präzision zurückgreifen. Zum Beispiel hat Windows 'GetTickCount'. * nix hat [clock_gettime] (http://linux.die.net/man/3/clock_gettime). – chris

+0

Ihr Titel und Fragenkörper fragen zwei verschiedene Dinge. – Pubby

+0

Führen Sie das Programm nicht in schneller Folge aus? Holen Sie sich einen Timer mit besserer Präzision? –

Antwort

1

Neben der Zeit, ist eine weitere gängige Methode, um Ihre Rand-Funktion zu säen, die Prozess-ID Ihres Programms zu verwenden, da dies garantiert einzigartig ist.

Der eigentliche Code ist plattformabhängig, aber wenn Sie auf Windows sind, glaube ich, die Funktion GetCurrentProcessId(), wie in

srand(GetCurrentProcessId()); 
+2

Auf diese Weise erhalten Sie immer die gleiche Randnummernfolge, wenn Sie die Funktion 'rand' aufrufen. – prehistoricpenguin

+0

@prehistoricpenguin Was meinst du? – Matt

+2

@prehistoricpenguin, Nur wenn Ihr Prozess jedes Mal die gleiche PID hat. Deshalb ist es eine gute Idee, es mit einer Zeitfunktion zu mischen. – chris

-2

Neben Eingabe der Zeit verwenden können, können Sie die CPU-Zeit in den das, was ich glaube, kann mit clock() gemacht werden. So würde es so aussehen: srand(time() + clock()).

2
int pid ; // get it as per your OS 
timeval t; 
gettimeofday(&t, NULL); 
srand(t.tv_usec * t.tv_sec * pid); 

Die Zeit gibt Ihnen Werte basierend auf second. gettimeofday basiert auf microseconds. So weniger Chance, dass der gleiche Samen passiert. Außerdem verwenden Sie auch die Prozess-ID.

6

Verwenden Sie auf POSIX-Systemen clock_gettime, um die aktuelle Zeit in Nanosekunden abzurufen. Wenn Sie nicht viele Bits benötigen, können Sie einfach den PRNG vergessen und die niederwertigen Bits der Zeit direkt als Ihre Zufallszahl verwenden. :-)

+0

Warum der Downvote? – Jean

+0

Ich vermute, dass jemand meine Idee, die niedrigen Bits der aktuellen Zeit für RNG zu verwenden, nicht mochte. Angesichts der Faktoren, die sie beeinflussen (Speicherlatenz, Cache-Treffer/Fehltreffer, TLB-Fehler, Swapping, Interrupt-Timing, Scheduling, ...) und die Tatsache, dass Nanosekunden ungefähr Zyklen auf modernen Maschinen entsprechen, sind sie ziemlich verdammt gute Entropiequelle. –

+0

Ich stimme zu. Es ist klug und elegant zugleich. Daher meine Frage. Ich sah verwirrt über den Downvote für eine solche angemessene Antwort auf die Frage. Es löst die Frage ziemlich gut (das Programm mehrmals in der gleichen Sekunde ausführen und jedes Mal dasselbe Ergebnis erhalten). – Jean

2

Wenn * nix, Warum liest du nicht direkt von /dev/random?

Sie können auch Rauschen von anderen Geräten wie der Tastatur, der Maus oder der CPU-Temperatur erfassen.

Sie können einen Beschleunigungsmesser verwenden, um Lärm von Meereswellen zu sammeln. Der Wind erzeugt auch Lärm.

Ich glaube, Glib bietet eine Funktion, g_random_int() die Zufallszahlen gleichmäßig verteilt in einer schnellen und portablen Weise produziert.

Oder Sie können einfach die Anzahl der temporalen Dateien in /tmp lesen und diese Zahl verwenden srand() mit einer time.h Funktion zu ernähren, oder den Inhalt einer Datei in /tmp lesen.

Sie können jede Datei von /usr/bin oder / lesen und etwas Essen für srand() sammeln.

+2

Herr -1, ich freue mich darauf, die Gründe zu lesen. – yeyo

Verwandte Themen