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?
Antwort
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());
Auf diese Weise erhalten Sie immer die gleiche Randnummernfolge, wenn Sie die Funktion 'rand' aufrufen. – prehistoricpenguin
@prehistoricpenguin Was meinst du? – Matt
@prehistoricpenguin, Nur wenn Ihr Prozess jedes Mal die gleiche PID hat. Deshalb ist es eine gute Idee, es mit einer Zeitfunktion zu mischen. – chris
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())
.
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.
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. :-)
Warum der Downvote? – Jean
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. –
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
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.
Herr -1, ich freue mich darauf, die Gründe zu lesen. – yeyo
- 1. Was ist der beste Weg, um einen Datenrahmen zu umgehen?
- 2. Was ist der beste Weg, um mit OSGI zu beginnen?
- 3. Was ist der beste Weg, um mehrere Aktionen zu behandeln?
- 4. Was ist der beste Weg, um vorberechnete Daten zu implementieren?
- 5. Was ist der beste Weg, um ein Verzeichnis zu leeren?
- 6. bash - Was ist der beste Weg, um Ergebnisse zu zählen?
- 7. Was ist der beste Weg, um ähnliche Strings zu bearbeiten?
- 8. Was ist der beste Weg, um eine Tabelle zu deduplizieren?
- 9. Was ist der beste Weg, um eine Eigenschaft zu deklarieren?
- 10. Was ist der beste Weg, um in C++ zu casten?
- 11. Was ist der beste Weg, um jQuery zu lernen?
- 12. Was ist der beste Weg, um innere Produkte zu bilden?
- 13. Was ist der beste Weg, um einen ByteArrayOutputStream zu schließen?
- 14. Was ist der beste Weg, um REST-Webdienste zu nutzen?
- 15. Was ist der beste Weg, um mehrere Suchoptionen zu behandeln?
- 16. Was ist der beste Weg, um eine IllegalArgumentException zu fangen
- 17. Was ist der beste Weg, um eine Liste zu kopieren?
- 18. Was ist der beste Weg, um Code zu organisieren?
- 19. Was ist der beste Weg, um mit NHibernate zu beginnen?
- 20. Was ist der beste Weg, um eine Animation zu fahren?
- 21. Was ist der beste Weg, um eine Sitemap zu erstellen?
- 22. Was ist der beste Weg, um einen "Timer" zu implementieren?
- 23. Was ist der beste Weg, um eine Enumeration zu erhöhen?
- 24. Was ist der beste Weg, um einen InputStream zu überwachen?
- 25. Was ist der beste Weg, um Flags Enum zu vergleichen?
- 26. Android, Was ist der beste Weg, um AbstractThreadedSyncAdapter zu töten?
- 27. Was ist der beste Weg zu
- 28. Was ist der beste Weg
- 29. Was ist der beste Weg, um einen Stream um
- 30. was der beste Weg
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
Ihr Titel und Fragenkörper fragen zwei verschiedene Dinge. – Pubby
Führen Sie das Programm nicht in schneller Folge aus? Holen Sie sich einen Timer mit besserer Präzision? –