Befestigungs-set.Samen für eine ganze session
Ich bin mit Hilfe von R zu konstruieren, ein Agenten-basiertes Modell mit einer monte-carlo-Verfahren. Dies bedeutet, dass ich viele Funktionen, die mit einem Zufallsgenerator in irgendeiner Form. Um reproduzierbare Ergebnisse, die ich beheben muss der Samen. Aber, soweit ich das verstanden habe, die ich einstellen muss das Saatgut vor jeder Auslosung oder der Probe. Dies ist eine echte Schmerzen im Nacken. Gibt es einen Weg, das zu beheben die Samen?
set.seed(123)
print(sample(1:10,3))
# [1] 3 8 4
print(sample(1:10,3))
# [1] 9 10 1
set.seed(123)
print(sample(1:10,3))
# [1] 3 8 4
InformationsquelleAutor der Frage Elad663 | 2013-12-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es mehrere Optionen, je nach Ihren genauen Bedarf. Ich vermute, die erste option, die einfachste ist es nicht ausreichend, aber meine zweite und Dritte Optionen besser geeignet sein können, mit der Dritten option die meisten automatisierbar.
Option 1
Wenn Sie im Voraus wissen, dass Sie die Funktion mithilfe/erstellen von Zufallszahlen wird, ziehen Sie immer die gleiche Zahl, und Sie nicht die Reihenfolge der Funktionsaufrufe oder legen Sie eine neue call-in zwischen bereits bestehenden, alles, was Sie tun müssen, ist, legen Sie die Samen einmal. In der Tat, werden Sie wahrscheinlich nicht wollen, zu halten, rücksetzen der Samen, wie Sie ' ll halten nur auf immer die selbe Reihe von Zufallszahlen für jeden Aufruf der Funktion.
Beispiel:
Option 2
Wenn Sie wirklich wollen, um sicherzustellen, dass eine Funktion verwendet, die gleichen Samen und Sie nur wollen, um es einmal, passieren die Samen als argument:
(wo
....
andere Argumente, um Ihre Funktion; das ist pseudo-code).Option 3
Wenn Sie möchten, dies zu automatisieren sogar mehr, dann könnte man den Missbrauch der
options
- Mechanismus, der ist in Ordnung, wenn Sie nicht gerade dabei sind, diese in einem Skript (für ein Paket, sollten Sie Ihre eigenen Optionen-Objekt). Dann deine Funktion Aussehen kann, für diese option. E. g.Dann in Gebrauch haben wir:
InformationsquelleAutor der Antwort Gavin Simpson
Ich denke, diese Frage leidet an einer Verwirrung. In dem Beispiel, die Samen hat für die gesamte Sitzung. Jedoch, dies bedeutet nicht, es wird die gleiche Reihe von zahlen jedes mal, wenn Sie die
print(sample))
Befehl beim laufen, das würde auch nicht Aussehen wie eine zufällige Prozess, als wäre es ganz bestimmt, dass die gleichen drei zahlen erscheinen würde, jedes mal. Stattdessen, was tatsächlich passiert, ist, dass, sobald Sie haben, legen Sie die Samen, jedes mal, wenn Sie ein Skript ausführen, die gleichen Samen erzeugt eine pseudo-zufällige Auswahl von zahlen, also zahlen, die Aussehen, als ob Sie zufällig sind, sondern sind in der Tat produziert durch einen reproduzierbaren Prozess mit den Samen, die Sie eingestellt haben.Wenn Sie erneut das gesamte script von Anfang an, Sie reproduzieren Sie jene zahlen, die Aussehen zufällig sind es aber nicht. Also, in dem Beispiel, das zweite mal, dass die Samen festgelegt ist 123, die Ausgabe ist wieder 9, 10 und 1, das ist genau das, was Sie erwarten würden, um zu sehen, weil der Prozess beginnt wieder von Anfang an. Wenn Sie weiterhin zu reproduzieren, die Ihre ersten run durch das schreiben
print(sample(1:10,3))
dann den zweiten Ausgang wieder 3, 8, und 4.Also die kurze Antwort auf die Frage ist: wenn Sie möchten, um einen seed zu erstellen, die einen reproduzierbaren Prozess dann tun Sie, was Sie getan haben, und legen Sie die Samen einmal, aber Sie sollten nicht legen Sie die Samen vor jeder Auslosung, weil das starten des pseudo-zufälligen Prozess wieder von Anfang an.
Diese Frage ist alt, aber immer noch kommt hoch in den Suchergebnissen, und es schien, lohnt sich die Erweiterung auf Spacedman Antwort.
InformationsquelleAutor der Antwort TilmanHartley
Keine Notwendigkeit. Obwohl die Ergebnisse unterscheiden sich von Probe zu Probe (die Sie fast sicher wollen, da sonst die Zufälligkeit ist sehr fraglich ist), werden die Ergebnisse vom " run " ausführen, wird die gleiche sein. Sehen Sie, hier ist die Ausgabe von meinem Rechner.
InformationsquelleAutor der Antwort Aaron
Könnte man einen wrapper-Funktion, etwa so:
Wahrscheinlich gibt es eine elegantere Art und Weise, und ich bin sicher, jemand Glockenspiel in. Aber, wenn Sie nicht, dies sollte Ihr Leben leichter machen.
InformationsquelleAutor der Antwort hd1
Schlage ich vor, dass Sie
set.seed
vor dem Aufruf jeder random number generator in R. ich denke, dass das, was Sie brauchen, ist Reproduzierbarkeit für Monte-Carlo-Simulationen. Wenn in einemfor
- Schleife, können Sieset.seed(i)
vor dem Aufrufsample
die garantiert werden, um vollständig reproduzierbar. In Ihrer äußeren Funktion, können Sie ein argument angebenseed=1
so, dass in derfor
Schleife, die Sie verwendenset.seed(i+seed)
.InformationsquelleAutor der Antwort alittleboy