Gibt es eine alternative zum Einsatz von Zeit, um Samen eine zufällige Zahl generation?

Ich versuche, mehrere Instanzen von einem Stück code (2000-Instanzen oder so) gleichzeitig in einem Rechner-cluster. Die Weise, die es funktioniert, ist, dass ich behaupte, dass die Arbeitsplätze und die cluster werden Sie als Knoten zu öffnen, bis jeder so oft, mehrere jobs pro Knoten. Dies scheint zu produzieren, die gleiche Werte für eine gute Anzahl von Instanzen in random number generation, die eine Zeit-Saatgut.

Gibt es eine einfache alternative, die ich stattdessen verwenden können? Reproduzierbarkeit und Sicherheit sind nicht wichtig, schnelle Generierung von einzigartigen Samen ist. Was wäre der einfachste Ansatz, um dieses, und, wenn möglich, eine cross-Plattform-Ansatz wäre gut.

  • Ich bin mir unklar über die situation.Sind Sie re-seeding
  • Welcher Algorithmus wird verwendet für die pseudo-random number generation? d.h. lcg, Marsaglia, Mersenne Twister, etc...
  • Re-seeding? Es ist ein Aufruf von srand (), wenn der kompilierte code ausgeführt wird. Aber über 100 gleichzeitige Instanzen von der kompilierte code laufen zur gleichen Zeit. Daher werden einige von denen 100 produzieren identische Zufallszahlen, da Ihre srand muss bei der gleichen Zeit.
  • sollten Sie eine gettimeofday nennen, und den Samen mit dem tv.tv_usec-Wert.
  • Ähm, ignorieren Sie, dass... es timed out oder so... hier meine eigentliche Antwort: Sie könnten versuchen, GUIDs, pürieren Sie diese und verwenden Sie, um Samen. Allerdings, wenn das cluster ist eine Maschine, können Sie eine Menge von gemeinsamen bits. Was könnte ich tun, haben Sie jede Anfrage ein samenkorn aus einem einzigen Samen Bereitstellung von Prozess - ... haben es seed eine Zufallszahl auf der Grundlage der Zeit. Und dann sitzt nur da und wartet für Saatgut-Anforderungen, auf die es reagiert mit die nächste zufällige Zahl in der Sequenz. Das sollte Ihnen eine schöne und gleichmäßige Verteilung der Samen für Ihre 2000 verarbeitet dabei die eigentliche Arbeit.
  • Sehen Sie, wenn Sie können die Samen und verwenden Sie Sie als input-Argumente auf Ihrem Programm. Es wird einfacher sein, zu erzeugen, 2000 einzigartige Samen, bevor Sie die 2000 Arbeitsplätze.
  • Brian, das wäre extrem kompliziert einzurichten, angesichts der Art und Weise der cluster eingerichtet wird. Einfach regelmäßig in einer Umgebung, die Sie Steuern, aber nicht in diese ein, wo ich kann nicht führen Sie alles auf, ohne sehr bestimmte Ressource anfordert, die kommen in die Warteschlange eingereiht und erst ausgeführt, für die bestimmte angeforderte Zeit, etc. Pre-Erzeugung von Samen ist mehr machbar, erfordert aber ein zusätzliches Skript oder code zu laufen, was irgendwie... unelegant, obwohl ich vielleicht am Ende tut es. Die rdtsc() Antwort unten scheint interessant, werde ich mir wohl geben, dass ein Schuss erste.
  • Zeit benutzen, aber fügen Sie in etwas, das in Bezug auf die lokale Plattform, wie zum Beispiel der IP-Adresse oder Ihren aktuellen thread die task-ID oder so.
  • Die richtige Antwort ist der eine erwähnt das C++11 std::random_device unten zu seed eine Zufallszahl-generator.
  • Das ist nicht die richtige Antwort, da diese Frage ist speziell tagged-C und nicht C++, aber das ist gut für die Menschen zu wissen, ob Sie mit C++11

InformationsquelleAutor CHP | 2011-10-01
Schreibe einen Kommentar