setze zufälligen Startwert programmweit in Python


83

Ich habe ein ziemlich großes Programm, in dem ich Funktionen aus dem randomModul 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?

Antworten:


120

Das Haupt-Python-Modul, das ausgeführt wird, sollte import randomund wird aufgerufen random.seed(n)- dies wird von allen anderen Importen gemeinsam genutzt, randomsolange an einer anderen Stelle der Startwert nicht zurückgesetzt wird.


3
könnte ich den Samen irgendwo zurücksetzen, ohne es zu wissen? weil das Setzen des Startwerts einmal in der Hauptdatei nicht ausreicht
Mischa Obrecht

1
@MischaObrecht Ich denke schon - der Startwert wird nur beim ersten Import des Zufallsmoduls initialisiert - wenn er mehr als einmal importiert wird, führt er die Initialisierung nicht durch und setzt den Startwert zurück - daher muss irgendwo in Ihrem Code ein expliziter Aufruf vorhanden sein
Jon Clements

3
Wenn Sie Methoden aus dem randomCode auf Modulebene aufrufen , den Sie in main importieren, bevor Sie in random.seed(n)in main gelangen, werden diese Aufrufe vor dem Seed ausgeführt und sind daher zeitlich festgelegt und effektiv nicht reproduzierbar zufällig.
Russell Borogove

13
Wenn sich herausstellt, dass Code von Drittanbietern das RNG neu aussetzt (unwahrscheinlich, aber möglich), können Sie über den random.Random()Konstruktor zusätzliche Zufallszahlengeneratoren mit unabhängigem Status erstellen und diese verwenden, wenn eine strikte Reproduzierbarkeit wichtig ist.
Russell Borogove

Das funktioniert bei mir nicht. Und ich habe keinen reproduzierbaren Code. Ich schätze, ich muss die Dokumentation aller importierten Bibliotheken überprüfen ... (siehe stackoverflow.com/questions/37886997/…
B Furtado

36

Der Kommentar von zss sollte als tatsächliche Antwort hervorgehoben werden:

Eine andere Sache, auf die die Leute achten sollten: Wenn Sie verwenden numpy.random, müssen Sie numpy.random.seed()den Samen setzen. Mit random.seed()wird nicht der Startwert für Zufallszahlen festgelegt, aus denen generiert wird numpy.random. Das verwirrte mich eine Weile. -zss


Absolut wahr, wenn Sie irgendwo in Ihrer Anwendung Zufallszahlen aus der random module, sagen wir Funktion random.choices()und dann weiter unten an einem anderen Punkt des numpyZufallszahlengenerators verwenden, sagen np.random.normal()wir , Sie müssen den Startwert für beide Module festlegen. Was ich normalerweise mache, ist, ein paar Zeilen in meinem main.pyLike zu habenrandom.seed(my_seed) und zu haben np.random.seed(my_seed). Ein großes
Lob

Sage hat ein ähnliches Problem, da sich sein PRNG sowohl von Pythons als auch von Numpys unterscheidet. Verwenden Sie set_random_seed()für Salbei.
Brent Baccala

8

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.


3

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!


23
Eine andere Sache, auf die die Leute achten sollten: Wenn Sie numpy.random verwenden, müssen Sie numpy.random.seed () verwenden, um den Startwert festzulegen. Bei Verwendung von random.seed () wird der Startwert für aus numpy.random generierte Zufallszahlen nicht festgelegt. Das hat mich eine Weile verwirrt.
Zss

1

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.


Guter Punkt, das hat mich schon mal verbrannt. Auch Dinge wie das Abrufen von Ergebnissen aus einer Datenbank kehren ebenfalls (zufällig) aus der Reihenfolge zurück, sofern Sie nichts anderes angeben
Justin Furuness

0

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.


-14

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.


10
Das Rollen eines eigenen Generators ist nicht erforderlich, da Python in seiner Standardbibliothek über hervorragende Zufallszahlenfunktionen verfügt und es sehr einfach ist, einen wirklich schlechten Generator zu erstellen, wenn Sie nicht wissen, was Sie tun.
Russell Borogove

6
Ich bin damit einverstanden, dass dies eine ziemlich schlechte Lösung ist: In Monte-Carlo-Simulationen (wie mein Programm lautet), in denen normalerweise Millionen von Stichproben gesammelt werden, können korrelierte Zufallszahlen (die von einem schlechten Generator stammen) Ihre Ergebnisse leicht durcheinander bringen !!
Mischa Obrecht

Du meinst, Knuth redet die ganze Zeit darüber? Selbst jetzt?
bedeutet-zu-Bedeutung
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.