Warum generiert runif nicht jedes Mal das gleiche Ergebnis?

11

Warum runif()generieren Zufallszahlengeneratoren wie in R nicht jedes Mal das gleiche Ergebnis?

Beispielsweise:

X <- runif(100)
X

generiert jedes Mal unterschiedliche Ausgänge.

Was ist der Grund dafür, jedes Mal unterschiedliche Ausgaben zu generieren?

Welche Funktionen hat es im Hintergrund, um dies zu tun?

Himabindu Kunani
quelle
3
Eine Möglichkeit, darüber nachzudenken, besteht darin, sich zu fragen: "Möchten Sie, dass Ihr Zufallszahlengenerator jedes Mal die gleichen Zahlen generiert?"
Shadowtalker
2
@ssdecontrol: Siehe Dilbert
Henry
2
Oder xkcd
Henry

Antworten:

18

Im Kern ist dies nicht wirklich nur eine R-Frage; es bezieht sich allgemeiner auf die Zufallszahlengenerierung.

"Zufallszahlen" sind in vielen Teilen der Statistik sehr wichtig. Wir benötigen die Zufallswerte, die wir generieren, um bestimmte Eigenschaften zu haben, und (normalerweise) wird viel Aufwand in die Erstellung von Zufallszahlengeneratoren und die Überprüfung ihrer Eigenschaften investiert.

Die Idee ist, dass wir eine Folge von Werten erhalten möchten, die ein guter Proxy für tatsächlich zufällige Zahlen sind. Das übliche Arbeitstier der Zufallszahlengenerierung ist die gleichmäßige Verteilung (daraus konstruieren wir andere, wie Gaußsche Zufallszahlen).

Daher wird (am typischsten) ein numerischer Algorithmus verwendet, um eine Folge von ganzen Zahlen zu konstruieren, jede in Bezug auf eine Funktion der vorherigen. Diese ganzen Zahlen werden dann so skaliert, dass sie zwischen 0 und 1 liegen (normalerweise ).[0,1)

Zum Beispiel arbeiten viele nur an der vorherigen:

x1=f(x0)z1=x1/mx2=f(x1)z2=x2/mx3=f(x2)z3=x3/m

xzf

x0

x3

Wenn Sie ?runifin R nachsehen, werden Sie feststellen, dass es die Existenz des Zufallsstartwerts erklärt, mit einem Link zu der Hilfe, ?.Random.seeddie die große Anzahl der in R verfügbaren Zufallszahlengeneratoren erklärt (Sie können sogar Ihre eigenen angeben). Auf derselben Hilfeseite wird erläutert, dass, wenn Sie zuvor keine Zufallszahlengenerierung verwendet oder den Startwert festgelegt haben, zunächst der Startwert aus der Uhr entnommen und anschließend der vorherige Wert gespeichert wird (sodass die nächste Zufallszahl angezeigt wird) das gleiche, das Sie erhalten hätten, wenn Sie beim letzten Mal einen weiteren Wert generiert hätten - es merkt sich, "wo Sie sind".

Die Funktion runifin R (wie einige andere Routinen zur Erzeugung von Zufallszahlen in anderen Paketen, die normalerweise etwas Ähnliches tun können) kennt den Ort, an dem der Startwert für Zufallszahlen aufbewahrt wird. Dieser Wert wird ständig aktualisiert. Es kann also funktionieren, ohne dass explizit ein Startwert übergeben werden muss, aber es wird immer noch einer verwendet. Wenn Sie ihm keinen gegeben haben, wird nur der zuletzt gespeicherte verwendet.

Warum es jedes Mal unterschiedliche Ausgaben gibt (wenn Sie nicht sagen, dass es dieselbe Sequenz geben soll): Dies geschieht, weil jedes Mal dieselben Werte normalerweise sehr kontraproduktiv wären - es würde nicht die Eigenschaften haben, die sich wiederholen Zufallsstichproben hätten, was es für die Putposes, für die wir Zufallszahlengeneratoren verwenden, nicht sehr nützlich macht.

Glen_b - Monica neu starten
quelle
14

Sie müssen den zufälligen Startwert festlegen , um jedes Mal das gleiche Ergebnis zu erzielen. Verwenden Sie dazu ? Set.seed . Erwägen:

> runif(1)
[1] 0.6467259
> runif(1)
[1] 0.2101857
> set.seed(1)
> runif(1)
[1] 0.2655087
> set.seed(1)
> runif(1)
[1] 0.2655087

Möglicherweise möchten Sie Folgendes lesen: Gründe für die Verwendung der Funktion set.seed .

gung - Monica wieder einsetzen
quelle
3
Obwohl dies die Mechanik der Reproduktion einer Reihe von Ergebnissen erklärt, scheint es nicht die Frage selbst zu beantworten, die sich fragt, warum diese Art von Verhalten nicht automatisch ist.
whuber
@whuber, ich denke, die Frage ist hier nicht im entferntesten thematisch. Ich habe dafür gestimmt, sofort zu schließen und hätte es sofort geschlossen, wenn ich dieses Privileg gehabt hätte. Ich habe dies gepostet, damit das OP nicht mit leeren Händen ist.
Gung - Reinstate Monica
Führen Sie jedes Mal "set.seed (1)" aus.
Nip