2017-07-22 3 views
1

Ich verwende srand((unsigned)time(NULL)), um den Randomizer in meinem C-Programm zu setzen. Ich habe festgestellt, dass wenn ich ein Array von Zufallszahlen mit Loops erzeuge, alle Zahlen gleich sind, wenn ich den Seeder innerhalb der Schleife statt außerhalb der Schleife platziere. Ich nehme an, das liegt daran, dass die Schleife extrem schnell läuft, aber wie arbeitet der Seeder, um den Randomizer neu zu seeden, wenn er außerhalb der Schleife ist? Ich bin verwirrt darüber, wie das im Programm funktioniert.Zeit verwenden, um den Randomizer in C mit Loops zu initialisieren

Antwort

4

Sie sollten nur srand einmal in Ihrem Programm. Da time(NULL) in Sekunden gemessen wird, säen Sie innerhalb einer Schleife denselben Wert immer und immer wieder. Jeder Seed wird einen deterministischen Strom von Pseudozufallszahlen erzeugen, aber das gleiche Setzen des gleichen Seeds erzeugt zweimal die gleiche Sequenz.

über srand: http://www.cplusplus.com/reference/cstdlib/srand/

über time: https://www.tutorialspoint.com/c_standard_library/c_function_time.htm

Warum einmal: srand() — why call it only once?

+1

Sie können auch xor mit der PID, um ein bisschen mehr "Zufälligkeit" zum Seed hinzufügen –

+1

Auch ist es gut, den Seed in ein Protokoll auszugeben, so dass Fehler reproduziert werden können –

3

srand((unsigned)time(NULL)) Mit dem Zufallszahlengenerator auf Saatgut nicht zuverlässig wie time() gibt die Anzahl der Sekunden seit Jan ist 1., 1970. Dieser Wert ändert sich nur jede Sekunde. Wenn Sie den Generator in der gleichen Sekunde erneut einsetzen, erhalten Sie in der Tat wieder die gleiche zufällige Reihenfolge.

Sie sollten eine Quelle verwenden, die schneller ändert:

srand((unsigned)clock()); 

Weiterhin Wieder Impfen der Generator wird nicht empfohlen. Der Pseudozufallszahlengenerator erzeugt eine Zufallssequenz mit bestimmten Eigenschaften. Die Neugenerierung des Generators bricht dieses Versprechen.

Verwandte Themen