2009-10-12 17 views
10

Betrachten Code wie dieser (Python):Wie unterschiedlich müssen Zufallssamen sein?

import random 

for i in [1, 2, 3, 4]: 
    random.seed(i) 
    randNumbers = [random.rand() for i in range(100)] # initialize a list with 100 random numbers 
    doStuff(randNumbers) 

ich sicherstellen möchten, dass randNumbers zum anderen erheblich von einem Anruf unterscheiden. Muss ich sicherstellen, dass die Seed-Nummern sich bei den nachfolgenden Aufrufen erheblich unterscheiden, oder reicht es aus, dass die Seeds unterschiedlich sind (egal wie)?

Zu den Pedanten: bitte den obigen Code erkennen, ist super-stark vereinfachte

+0

"different significant", im Zusammenhang mit Zufallsgeneratoren, könnte viele verschiedene Dinge bedeuten. Gibt es bestimmte Tests der Zufälligkeit, die Sie suchen und nicht bestehen? Typische PRNGs haben Perioden, die viel, viel länger als 100 Zahlen sind. Normalerweise sieht man ein einzelnes Seeding-Ereignis von einer Systemuhr. Wenn Sie denselben Seed-Wert wie Sie verwenden, wird jedes Mal dieselbe pseudozufällige Sequenz generiert. – Mikeb

+0

Könnten Sie bitte erklären, warum Sie möchten, dass Ihre Pseudozufallszahlen sich signifikant unterscheiden? Vereitelt man nicht den Zweck von Zufallszahlen, wenn man eine Abweichung benötigt - aus statistischer Sicht ist es ebenso wahrscheinlich, dass zwei Zahlen dicht beieinander liegen, wenn man weit voneinander entfernt ist (wenn sie wirklich zufällig sind) –

Antwort

8

Kurze Antwort: Vermeiden Sie das Re-Seeding, da Sie hier nichts kaufen können. Lange Antwort unten.


Das hängt davon ab, was genau Sie brauchen. In Common defects in initialization of pseudorandom number generators wird dargelegt, dass lineare abhängige Seeds (welche definitiv 1,2, 3, 4 sind) eine schlechte Wahl für die Initialisierung mehrerer PRNGs sind, zumindest wenn sie für die Simulation verwendet werden und unkorrelierte Ergebnisse wünschen.

Wenn Sie nur ein paar Würfel würfeln oder irgendeine pseudozufällige Eingabe für etwas unkritisches erzeugen, dann spielt es wahrscheinlich keine Rolle.

Beachten Sie auch, dass die Verwendung einiger Klassen eines PRNG selbst zum Generieren von Seeds das gleiche Problem beim Erzeugen linearer abhängiger Zahlen hat (LCGs fallen mir ein).

2

Generell Sie nur Ihren Zufallszahlengenerator Samen, wenn Sie Notwendigkeit die Zufallszahl in identischer Weise erzeugt werden, jedes Mal durch . Dies ist nützlich, wenn Sie eine zufällige Komponente zu Ihrer Verarbeitung haben, diese aber testen müssen und daher zwischen den Tests konsistent sein möchten. Andernfalls lässt das System den Generator selbst säen.

Mit anderen Worten, durch die Aussaat des Zufallszahlengenerators mit bestimmten vordefinierten Seeds reduzieren Sie tatsächlich die Zufälligkeit des Systems als Ganzes. Die Zufallszahlen, die erzeugt werden, wenn ein Startwert von 1 verwendet wird, sind tatsächlich pseudozufällig verschieden von denen mit einem Startwert von 2, aber ein hart codierter Startwert führt zu wiederholten Zufallsfolgen in jedem Lauf des Programms.

0

Die Seeds selbst sollten zufällig sein, so dass die Ausgabe unvorhersehbar ist. Es kann Probleme geben, wenn sich die Seeds nur in ein oder zwei Bits unterscheiden (wie this question demonstriert).

+1

Manuelles Seeding bedeutet normalerweise, dass die Ausgabe nicht unvorhersehbar sein muss. Und wie stark sich die Samen unterscheiden, hängt stark vom Algorithmus des PRNG ab. – Joey

+0

Es impliziert, dass die Ausgabe nicht unvorhersehbar sein muss, aber das geht auch davon aus, dass der Fragesteller tatsächlich erkennt, dass gesetzte Generatoren in der gleichen Folge von Zahlen resultieren. – Matt

+0

@Johannes: Absolut, aber wenn Sie wirklich unvorhersehbare Ausgabe wollen, dann wollen Sie nicht, dass jemand den Samen erraten kann. Aus diesem Grund ist es am besten, dass der Seed selbst völlig unvorhersehbar ist (z. B. von/dev/random). –

0

Es hängt von der Anwendung ab, für die Sie den PRNG verwenden. Wenn Sie etwas verwenden, das kryptografisch fundiert sein muss, müssen die Seeds basierend auf der Ausgabe im Allgemeinen extrem schwer abzuleiten sein, jedes Mal anders, wenn die Anwendung ausgeführt wird, schwer zu erraten und durch Reverse Engineering der Anwendung unmöglich zu bestimmen (dh sie können nicht hart codiert werden).

Wenn Ihr Ziel ein Spiel ist, können Ihre Anforderungen abweichen. Wenn Sie beispielsweise die Computerstrategie kontrollieren, aber die Strategie des Computers für alle Läufe des Spiels gleich bleibt, haben Sie möglicherweise ein leicht zu schlagendes Spiel. Dann möchten Sie vielleicht, dass für "Easy" -Modus.

+1

Wenn das etwas mit Krypto zu tun hat, dann ist MT19937 jedoch ein sehr falscher Generator. – Joey

1

Sie scheinen Pseudozufallszahlen zu haben, die nicht pseudozufällig sind, mit einer höheren Wahrscheinlichkeit, dass aufeinanderfolgende Zahlen sich "signifikant" von Pseudozufälligkeit unterscheiden. Ich bezweifle, dass ein gewöhnlicher prng dies tun wird, egal was für eine Strategie du hast.

4

Wenn Ihr Zufallszahlengenerator von hoher Qualität ist, sollte es egal sein, wie Sie ihn erzeugen. In der Tat wäre die beste Vorgehensweise, es nur einmal zu säen.Zufallszahlengeneratoren haben ein bestimmtes statistisches Verhalten , sobald sie gestartet werden. Durch häufiges Nachsynchronen wird ein anderer Zufallszahlengenerator erzeugt, der möglicherweise nicht so gut ist.

Zufallsauswahl Samen klingt wie eine gute Idee, aber es ist nicht. Aufgrund des "Geburtstagsparadoxons" gibt es eine überraschend hohe Wahrscheinlichkeit, dass Sie den gleichen Samen zweimal auswählen.

Verwandte Themen