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
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?
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.
- 1. randomizer erzeugt nur bis zu 99 C++
- 2. Unendliche Loops in C
- 3. Wie Loops verwenden in teradata
- 4. Initialisieren einer C++ - Referenz - warum nicht den Adressoperator verwenden?
- 5. Mit jQuery live(), um Plugins zu initialisieren?
- 6. C# Nested Loops
- 7. Mehrere while loops mit printf in C
- 8. Verwenden von übergebenen Array, um andere Array zu initialisieren
- 9. Loops in Loops
- 10. Counts und Loops in C#
- 11. Wie zwei Checkpoint-Dateien verwenden, um das Diagramm zu initialisieren
- 12. Verwenden Sie Funktionsaufruf Ergebnis, um mehrere Mitglieder in C++ 03 zu initialisieren?
- 13. Richtiger Weg, um eine C++ Membervariable bedingt zu initialisieren?
- 14. Moment verwenden, um Zeit in Bezug auf jetzt zu formatieren
- 15. wie gcc 4.4.7 zu verwenden, um C++ Code mit den C++ 11 Funktionen zu kompilieren
- 16. Der beste Ort, um den Zufallsgenerator zu initialisieren
- 17. initialisieren structs in C++
- 18. was zu verwenden, um zwischen Vergleichen in c zu überprüfen?
- 19. C#: N Für Loops
- 20. Stoppen Sie den Synchronisationsadapter, um ihn zu initialisieren, wenn Sie addPeriodicSync verwenden
- 21. jquery verwenden ein Bootstrap-Fortschrittsbalken zu initialisieren
- 22. machen Javascript Bild Randomizer mit CSS ansprechen?
- 23. Eine gute Randomizer für Puzzle-15
- 24. Für Loops und Arrays in C
- 25. Mit Dekletyp zu initialisieren Container
- 26. Ist es eine gute Übung, `fwrite` in Loops zu verwenden?
- 27. Mongodb nimmt zu viel Zeit, um den Rekord zu finden
- 28. Verwenden für eine Weile Loops
- 29. C# Datatable mit Loops füllen - wie?
- 30. Könnte ich boost :: serialization-Bibliothek verwenden, um eine unionartige Klasse von C++ zu initialisieren.
Sie können auch xor mit der PID, um ein bisschen mehr "Zufälligkeit" zum Seed hinzufügen –
Auch ist es gut, den Seed in ein Protokoll auszugeben, so dass Fehler reproduziert werden können –