In meinem Programm muss ich N separate Threads mit jeweils einem eigenen RNG ausführen, mit dem ein großer Datensatz abgetastet wird. Ich muss in der Lage sein, diesen gesamten Prozess mit einem einzigen Wert zu versehen, damit ich Ergebnisse reproduzieren kann.
Reicht es aus, den Startwert für jeden Index einfach nacheinander zu erhöhen?
Derzeit verwende ich numpy
‚s , RandomState
die einen Mersenne - Twister Pseudo-Zufallszahlen - Generator verwendet.
Codeausschnitt unten:
# If a random number generator seed exists
if self.random_generator_seed:
# Create a new random number generator for this instance based on its
# own index
self.random_generator_seed += instance_index
self.random_number_generator = RandomState(self.random_generator_seed)
Im Wesentlichen beginne ich mit einem vom Benutzer eingegebenen Startwert (falls vorhanden) und füge für jede Instanz / jeden Thread nacheinander den Index (0 bis N-1) der ausgeführten Instanz hinzu. Ich weiß nicht, ob dies eine gute Praxis ist oder ob es einen besseren Weg gibt, dies zu tun.
Antworten:
Es ist sicherlich keine großartige Übung. Überlegen Sie beispielsweise, was passiert, wenn Sie zwei Läufe mit Root-Seeds von 12345 und 12346 ausführen. Jeder Lauf hat gemeinsame
N-1
Streams.Mersenne Twister-Implementierungen (einschließlich
numpy.random
undrandom
) verwenden normalerweise ein anderes PRNG, um den ganzzahligen Startwert in den von MT verwendeten großen Zustandsvektor (624 32-Bit-Ganzzahlen) zu erweitern. Dies ist das Array vonRandomState.get_state()
. Eine gute Möglichkeit, das zu tun, was Sie möchten, besteht darin, dieses PRNG auszuführen, das einmal mit Ihrer Eingabe-Ganzzahl gesetzt wurde, undN*624
32-Bit-Ganzzahlen daraus abzurufen. Teilen Sie diesen Stream inN
Statusvektoren auf undRandomState.set_state()
initialisieren Sie jedeRandomState
Instanz explizit . Möglicherweise müssen Sie die C-Quellen dernumpy.random
oder_random
aus der Standardbibliothek konsultieren , um diese PRNG zu erhalten (sie sind identisch). Ich bin nicht sicher, ob jemand eine eigenständige Version dieses PRNG für Python implementiert hat.quelle
RandomState
Implementierungen in der Entwicklung, die einen Algorithmus mit einstellbaren Streams verwendet. Das heißt, Sie initialisieren jedeRandomState
Instanz mit demselben Startwert und unterschiedlichen Stream-IDs (nur inkrementiert ist in Ordnung), und Ihnen werden unabhängige Streams garantiert. pypi.python.org/pypi/randomstatequelle
Es gibt jetzt ein Python-Paket namens RandomGen , das Methoden hat, um dies zu erreichen.
Es unterstützt unabhängige Streams, die aus einem einzelnen Startwert erstellt wurden, sowie ein Sprungprotokoll für ältere Zufallszahlengeneratoren wie MT19937.
quelle
Einige Leute behaupten, dass es Korrelationen in den Zufallszahlen gibt, die durch aufeinanderfolgende Samen erzeugt werden. /programming/10900852/near-seeds-in-random-number-generation-may-give-similar-random-numbers Ich bin mir nicht sicher, wie wahr das ist.
Wenn Sie sich darüber Sorgen machen, warum nicht einen einzigen Zufallszahlengenerator verwenden, um die Startwerte für alle anderen Generatoren auszuwählen?
quelle