Ich habe ein ziemlich großes Programm, in dem ich Funktionen aus dem random
Modul in verschiedenen Dateien verwende. Ich möchte in der Lage sein, den zufälligen Startwert einmal an einer Stelle festzulegen, damit das Programm immer die gleichen Ergebnisse zurückgibt. Kann das überhaupt erreicht werden python
?
83
random
Code auf Modulebene aufrufen , den Sie in main importieren, bevor Sie inrandom.seed(n)
in main gelangen, werden diese Aufrufe vor dem Seed ausgeführt und sind daher zeitlich festgelegt und effektiv nicht reproduzierbar zufällig.random.Random()
Konstruktor zusätzliche Zufallszahlengeneratoren mit unabhängigem Status erstellen und diese verwenden, wenn eine strikte Reproduzierbarkeit wichtig ist.Der Kommentar von zss sollte als tatsächliche Antwort hervorgehoben werden:
quelle
random module
, sagen wir Funktionrandom.choices()
und dann weiter unten an einem anderen Punkt desnumpy
Zufallszahlengenerators verwenden, sagennp.random.normal()
wir , Sie müssen den Startwert für beide Module festlegen. Was ich normalerweise mache, ist, ein paar Zeilen in meinemmain.py
Like zu habenrandom.seed(my_seed)
und zu habennp.random.seed(my_seed)
. Ein großesset_random_seed()
für Salbei.Stellen Sie zu Beginn Ihres Anwendungsaufrufs
random.seed(x)
sicher, dass x immer gleich ist. Dadurch wird sichergestellt, dass die Reihenfolge der Pseudozufallszahlen bei jedem Lauf der Anwendung gleich ist.quelle
Jon Clements beantwortet so ziemlich meine Frage. Es war jedoch nicht das eigentliche Problem: Es stellte sich heraus, dass der Grund für die Zufälligkeit meines Codes die numpy.linalg SVD war, da sie bei schlecht konditionierten Matrizen nicht immer die gleichen Ergebnisse liefert !!
Überprüfen Sie dies in Ihrem Code, wenn Sie dieselben Probleme haben!
quelle
Aufbauend auf früheren Antworten: Beachten Sie, dass viele Konstrukte unterschiedliche Ausführungspfade aufweisen können, selbst wenn alle Seeds gesteuert werden.
Ich dachte " Nun, ich habe meine Seeds so gesetzt, dass sie immer gleich sind und ich keine sich ändernden / externen Abhängigkeiten habe, daher sollte der Ausführungspfad meines Codes immer der gleiche sein ", aber das ist falsch.
Das Beispiel, das mich gebissen hat, war
list(set(...))
, wo die resultierende Reihenfolge abweichen kann.quelle
Eine wichtige Einschränkung ist, dass Wörterbuchschlüssel für Python-Versionen vor 3.7 nicht deterministisch sind. Dies kann zu Zufälligkeiten im Programm oder sogar zu einer anderen Reihenfolge führen, in der die Zufallszahlen generiert werden, und daher zu nicht deterministischen Zufallszahlen. Fazit Update Python.
quelle
Sie können dies ziemlich einfach garantieren, indem Sie Ihren eigenen Zufallszahlengenerator verwenden.
Wählen Sie einfach drei größere Primzahlen aus (vorausgesetzt, dies ist keine Kryptografieanwendung) und schließen Sie sie an a, b und c an: a = ((a * b)% c) Dies ergibt ein Rückkopplungssystem, das ziemlich zufällige Daten erzeugt. Beachten Sie, dass nicht alle Primzahlen gleich gut funktionieren, aber wenn Sie nur eine Simulation durchführen, sollte dies keine Rolle spielen - alles, was Sie für die meisten Simulationen wirklich benötigen, ist ein Durcheinander von Zahlen mit einem Muster (pseudozufällig, denken Sie daran), das komplex genug ist Es stimmt in keiner Weise mit Ihrer Anwendung überein.
Knuth spricht darüber.
quelle