Was genau ist ein Startwert in einem Zufallszahlengenerator?


21

Ich habe eine gewöhnliche Google-Suche usw. versucht, aber die meisten Antworten, die ich finde, sind entweder mehrdeutig oder sprach- / bibliotheksspezifisch wie Python oder C ++ stdlib.husw. Ich suche eine sprachunabhängige, mathematische Antwort, nicht die Besonderheiten einer Bibliothek.

Zum Beispiel sagen viele, dass der Startwert ein Ausgangspunkt für einen Zufallszahlengenerator ist und derselbe Startwert immer die gleiche Zufallszahl erzeugt. Was heißt das? Bedeutet dies, dass die Ausgabezahl eine deterministische Funktion eines bestimmten Startwerts ist und die Zufälligkeit vom Wert des Startwerts abhängt? Aber wenn das der Fall ist, dann schaffen wir, die Programmierer, die Zufälligkeit, indem wir den Samen liefern, anstatt die Maschine das tun zu lassen?

Was bedeutet in diesem Zusammenhang auch ein Ausgangspunkt ? Ist dies eine nicht strenge Art und Weise, ein Element der Domäne einer Map ? Oder verstehe ich etwas falsch? f : XYxXf:XY


7
Ich fühle mich nicht qualifiziert, eine Antwort zu schreiben, aber vielleicht finden Sie den Wikipedia-Artikel über den Mersenne Twister aufschlussreich, insbesondere den Abschnitt über die Initialisierung . Kurz gesagt, ein Pseudozufallszahlengenerator wie der Mersenne Twister wird irgendwann seine Ausgabe wiederholen. Beim MT hat der Zeitraum Länge 2^19937 − 1. Der Startpunkt ist der Punkt dieser extrem langen Sequenz, an dem der Generator startet. Also ja, es ist deterministisch.
IonicSolutions

1
Ein Pseudozufallszahlengenerator ist eine endlos wiederholte feste Liste von Zahlen. Wo fängt es an? Du musst sagen.
Whuber

2
@whuber Ich denke eigentlich, dein Kommentar wäre eine tolle Antwort.
David Z

Antworten:


22

Die meisten Pseudozufallszahlengeneratoren (PRNGs) basieren auf Algorithmen, die eine Art rekursives Verfahren verwenden, wobei von einem Basiswert ausgegangen wird, der durch eine Eingabe bestimmt wird, die als "Startwert" bezeichnet wird. Das Standard-PRNG in den meisten statistischen Programmen (R, Python, Stata usw.) ist der Mersenne-Twister-Algorithmus MT19937, der in Matsumoto und Nishimura (1998) beschrieben ist . Dies ist ein komplizierter Algorithmus. Lesen Sie daher am besten das Papier, wenn Sie wissen möchten, wie er im Detail funktioniert. In diesem speziellen Algorithmus gibt es eine Wiederholungsbeziehung vom Grad , und Ihr Eingabesamen ist eine Anfangsmenge von Vektoren . Der Algorithmus verwendet eine lineare Wiederholungsrelation, die Folgendes generiert:x 0 , x 1 , . . . , x n - 1nx0,x1,...,xn1

xn+k=f(xk,xk+1,xk+m,r,A),

Dabei sind und und Objekte, die im Algorithmus als Parameter angegeben werden können. Da der Startwert den anfänglichen Satz von Vektoren (und gegebene andere feste Parameter für den Algorithmus) angibt, ist die Reihe von Pseudozufallszahlen, die durch den Algorithmus erzeugt werden, fest. Wenn Sie den Startwert ändern, ändern Sie die Anfangsvektoren, wodurch die vom Algorithmus generierten Pseudozufallszahlen geändert werden. Dies ist natürlich die Funktion des Samens.1mnrA

Nun ist es wichtig anzumerken, dass dies nur ein Beispiel ist, das den MT19937-Algorithmus verwendet. Es gibt viele PRNGs, die in statistischer Software verwendet werden können, und sie beinhalten jeweils unterschiedliche rekursive Methoden, und daher bedeutet der Startwert in jedem von ihnen eine andere Sache (in technischen Begriffen). RIn dieser Dokumentation finden Sie eine Bibliothek mit PRNGs , in der die verfügbaren Algorithmen und die Papiere aufgeführt sind, in denen diese Algorithmen beschrieben werden.

Der Zweck des Startwerts besteht darin, dem Benutzer zu ermöglichen, den Pseudozufallszahlengenerator zu "sperren", um eine reproduzierbare Analyse zu ermöglichen. Einige Analysten möchten den Startwert mithilfe eines echten Zufallszahlengenerators (TRNG) festlegen, der Hardwareeingaben verwendet, um eine anfängliche Startwertnummer zu generieren, und diese dann als gesperrte Nummer melden. Wenn der Startwert vom ursprünglichen Benutzer festgelegt und gemeldet wird, kann ein Prüfer die Analyse wiederholen und die gleiche Folge von Pseudozufallszahlen wie der ursprüngliche Benutzer erhalten. Wenn der Startwert nicht festgelegt ist, verwendet der Algorithmus normalerweise eine Art Standardstartwert (z. B. von der Systemuhr), und es ist im Allgemeinen nicht möglich, die Randomisierung zu replizieren.


+1. Es wäre gut hinzuzufügen, was (normalerweise) passiert, wenn man den Samen nicht explizit bereitstellt.
Amöbe sagt Reinstate Monica

1
@amoeba: Der 4. Absatz meiner Antwort behandelt dies kurz.
BruceET

1
Während dies die Grundlagen der Frage beantwortet, berührt es nicht die Tatsache, warum wir dies in Simulationen benötigen. Es ist sehr schwer, WAHREN Zufall zu erzeugen - und wenn Sie das haben, können Sie die ursprüngliche Antwort nicht reproduzieren! Geben Sie das PNRG ein ... mit all seinen Problemen.
Paul Palmpje

@amoeba: Wie gewünscht, habe ich einen zusätzlichen Absatz hinzugefügt, um dies zu verdeutlichen.
Setzen Sie Monica

1
Vielen Dank. "Default Seed" klingt ein bisschen so, als ob es immer der gleiche Standardwert für Seed ist. ich meinte damit, dass normalerweise der seed von der systemuhr genommen wird. Das finde ich gut zu wissen.
Amöbe sagt Reinstate Monica

16

Erstens gibt es in den heutigen computergenerierten "Zufallszahlen" keine echte Zufälligkeit . Alle Pseudozufallsgeneratoren verwenden deterministische Methoden. (Möglicherweise werden Quantencomputer das ändern.)

Die schwierige Aufgabe besteht darin, Algorithmen zu entwickeln, die eine Ausgabe erzeugen, die nicht sinnvoll von Daten unterschieden werden kann, die aus einer wirklich zufälligen Quelle stammen.

Sie haben Recht, dass das Setzen eines Startwerts Sie an einem bestimmten bekannten Startpunkt in einer langen Liste von Pseudozufallszahlen startet. Für die in R, Python usw. implementierten Generatoren ist die Liste enorm lang. Ausreichend lang, dass nicht einmal das größte realisierbare Simulationsprojekt die 'Periode' des Generators überschreitet, sodass die Werte erneut durchlaufen werden.

Bei vielen gewöhnlichen Anwendungen setzen die Menschen keinen Samen. Dann wird automatisch ein unvorhersehbarer Startwert ausgewählt (z. B. aus den Mikrosekunden der Betriebssystemuhr). Pseudozufallsgeneratoren, die im allgemeinen Gebrauch sind, wurden Testbatterien unterzogen, die größtenteils aus Problemen bestehen, die sich mit früheren, unbefriedigenden Generatoren als schwierig zu simulieren erwiesen haben.

Normalerweise besteht die Ausgabe eines Generators aus Werten, die aus praktischen Gründen nicht von Zahlen zu unterscheiden sind, die wirklich zufällig aus der Gleichverteilung aufDann werden diese Pseudozufallszahlen so manipuliert, dass sie mit denen übereinstimmen, die zufällig von anderen Verteilungen wie Binomial, Poisson, Normal, Exponential usw. abgetastet werden.(0,1).

Ein Test eines Generators besteht darin, ob seine aufeinanderfolgenden Paare in 'Beobachtungen', die als simuliert werden, tatsächlich so aussehen, als würden sie das Einheitsquadrat zufällig ausfüllen. (Unten zweimal ausgeführt.) Das leicht marmorierte Aussehen ist das Ergebnis von inhärenten Schwankungen. Es wäre sehr verdächtig, ein Grundstück zu bekommen, das vollkommen gleichmäßig grau aussieht. [Bei einigen Auflösungen kann es zu einem regelmäßigen Moiré-Muster kommen. Bitte ändern Sie die Vergrößerung nach oben oder unten, um den falschen Effekt zu beseitigen, falls er auftritt.]Unif(0,1)

set.seed(1776);  m = 50000
par(mfrow=c(1,2))
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
par(mfrow=c(1,1))

Bildbeschreibung hier eingeben

Es ist manchmal nützlich, einen Samen zu setzen. Einige solche Verwendungen sind wie folgt:

  1. Beim Programmieren und Debuggen ist eine vorhersehbare Ausgabe von Vorteil. So viele Programmierer setzen eine set.seedAnweisung zu Beginn eines Programms, bis das Schreiben und Debuggen abgeschlossen ist.

  2. Beim Unterrichten über Simulation. Wenn ich den Schülern zeigen möchte, dass ich mit der sampleFunktion in R Würfe eines fairen Würfels simulieren kann , könnte ich schummeln, viele Simulationen ausführen und die auswählen, die einem theoretischen Zielwert am nächsten kommt. Dies würde jedoch einen unrealistischen Eindruck davon vermitteln, wie die Simulation wirklich funktioniert.

    Wenn ich zu Beginn einen Startwert setze, wird die Simulation jedes Mal dasselbe Ergebnis erzielen. Die Schüler können ihre Kopie meines Programms Korrektur lesen, um sicherzustellen, dass die beabsichtigten Ergebnisse erzielt werden. Dann können sie ihre eigenen Simulationen ausführen, entweder mit ihren eigenen Samen oder indem sie das Programm einen eigenen Startplatz auswählen lassen.

    Zum Beispiel ist die Wahrscheinlichkeit, die 10 zu bekommen, wenn zwei faire Würfel gewürfelt werden,Mit einer Million Experimente mit zwei Würfeln sollte ich eine Genauigkeit von zwei oder drei Stellen erreichen. Die 95% -Marge des Simulationsfehlers beträgt ungefähr

    3/36=1/12=0.08333333.
    2(1/12)(11/12)/106=0.00055.
    set.seed(703);  m = 10^6
    s = replicate( m, sum(sample(1:6, 2, rep=T)) )
    mean(s == 10)
    [1] 0.083456         # aprx 1/12 = 0.0833
    2*sd(s == 10)/sqrt(m)
    [1] 0.0005531408     # aprx 95% marg of sim err.
    
  3. Beim Teilen statistischer Analysen, die Simulationen beinhalten. Heutzutage beinhalten viele statistische Analysen eine Simulation, zum Beispiel einen Permutationstest oder einen Gibbs-Sampler. Indem Sie den Ausgangswert anzeigen, können Personen, die die Analyse lesen, die Ergebnisse auf Wunsch genau replizieren.

  4. Beim Schreiben von wissenschaftlichen Artikeln mit Randomisierung. Akademische Artikel durchlaufen in der Regel mehrere Peer-Review-Runden. Ein Plot kann beispielsweise zufällig gestörte Punkte verwenden, um ein Überplotten zu reduzieren. Wenn die Analysen als Reaktion auf Kritikerkommentare leicht geändert werden müssen, ist es gut, wenn sich ein bestimmtes, nicht zusammenhängendes Jitter zwischen den Review-Runden nicht ändert, was für besonders nervtötende Kritiker verwirrend sein könnte. Setzen Sie also einen Startwert vor dem Jitter.


1
Sehr schön, +1. Ich habe mir erlaubt, einen vierten Punkt hinzuzufügen.
S. Kolassa - Wiedereinsetzung von Monica

Meinen Sie also, ein Pseudozufallszahlengenerator speichert grundsätzlich eine periodische Folge von Zufallszahlen (gleichmäßig verteilt in [0, 1]) und ein Startwert ist lediglich ein Index für die Folge? Bedeutet das also, dass die generierte Zufallszahl eine deterministische Funktion des Samens ist?
Della

9
Sie benötigen keinen Quantencomputer, um Quantenphänomene zu verwenden und einen Zufallsgenerator zu haben ( en.wikipedia.org/wiki/Hardware_random_number_generator )
Guiroux

1
@Della. Sie haben im Wesentlichen die richtige Idee. Aber bitte haben Sie Verständnis dafür, dass die 'Periode' in der Praxis sehr groß sein muss. (Egal wie groß Ihr Simulationsprojekt ist, Sie möchten nicht, dass es wiederholt wird.) IonicSolutions gibt beispielsweise nach dem Q an, dass der Mersenne Twilster-Generator eine Periode von etwas größer ist, als ich mir leicht vorstellen kann. // Wenn Sie den Samen kennen, können Sie die Pseudozufallsfolge von dort erzeugen. // Generatoren wurden zum Verschlüsseln von Nachrichten verwendet. Die Standards für sichere Generatoren für die Verschlüsselung unterscheiden sich jedoch von den Standards für Generatoren für die Wahrscheinlichkeitssimulation. 2199371,
BruceET

@ Guiroux. Die Möglichkeit, die ich bei Quantencomputern erwähnen wollte, bestand darin, echte Zufallszahlengeneratoren zu haben, die so schnell sind wie die heutigen Pseudozufallsgeneratoren. In den 1950er Jahren wurden Quellen für 'wahre' Zufallszahlen für die Randomisierung im experimentellen Design und für (langsame, begrenzte) Probensimulationen verwendet. Vielleicht sehen Sie Million Random Digits .
BruceET

0

TL; DR;

Mit einem Startwert können Sie normalerweise die Folge von Zufallszahlen reproduzieren. In diesem Sinne handelt es sich nicht um echte Zufallszahlen, sondern um "Pseudozufallszahlen", daher ein PNR-Generator (PNRG). Dies ist eine echte Hilfe im wirklichen Leben!

Ein bisschen mehr Detail:

Praktisch alle in Computersprachen implementierten "Zufalls" -Zahlengeneratoren sind Pseudozufallszahlengeneratoren. Dies liegt daran, dass sie bei gegebenem Startwert (===> Startwert) immer die gleiche Folge von Pseudozufallsergebnissen liefern. Ein guter Generator erzeugt eine Sequenz, die statistisch nicht von einer echten Zufallssequenz zu unterscheiden ist (einen echten Würfel, eine echte Münze usw. werfen).

In vielen Simulationsfällen möchten Sie eine echte "zufällige" Erfahrung machen. Sie möchten jedoch auch Ihre Ergebnisse reproduzieren können. Warum? Nun, zumindest die Aufsichtsbehörden interessieren sich für diese besondere Sache.

Es gibt viel zu erleben. Die Leute analysieren sogar die "besten" zufälligen Samen. Meiner Meinung nach macht dies ihr Modell ungültig, da sie nicht mit "echtem" Zufallsverhalten umgehen können - oder ihr PRNG ist nicht für ihre Implementierung geeignet. Meistens machen sie einfach nicht genug Simulationen - aber sie brauchen Zeit.

Stellen Sie sich nun ein "echtes" RNG vor. Man könnte dies basierend auf einer Art Zufall in der Maschine implementieren. Wenn Sie nur einen zufälligen Startwert nehmen (z. B. jetzt die Zeit), erstellen Sie eine Art zufälligen Startpunkt, aber die Zufälligkeit der Sequenz hängt immer noch vom Algorithmus ab, um die nächsten Zahlen zu bestimmen. Dies ist in den meisten Fällen wichtiger als der Ausgangspunkt, da die Verteilung der Ergebnisse das tatsächliche "Ergebnis" bestimmt. Wenn Ihre Sequenz wirklich zufällig sein sollte, wie würden Sie dies implementieren? Man kann sagen, dass Clock Ticks eines Computers deterministisch sind und ansonsten wahrscheinlich eine große Autokorrelation aufweisen. Also was kannst du tun? Die beste bisherige Lösung ist die Implementierung eines soliden PNRG.

Quanten-Computing? Ich bin mir nicht sicher, ob das behoben werden kann.

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.