2012-06-05 4 views
5

Ich benutze sequentielle Seeds (1,2,3,4, ...) für die Generierung von Zufallszahlen in einer Simulation. Sind die generierten Pseudozufallszahlen durch die Tatsache, dass die Samen nahe beieinander liegen, ähnlich?In der Nähe von Samen in Zufallsgenerierung kann ähnliche Zufallszahlen geben?

Ich denke, es ändert nichts, aber ich bin mit Python

Edit: Ich habe einige Tests durchgeführt und die Zahlen nicht ähnlich aussehen. Aber ich fürchte, dass die Ähnlichkeit nicht allein durch das Betrachten der Zahlen bemerkt werden kann. Gibt es ein theoretisches Merkmal der Zufallszahlengenerierung, das garantiert, dass verschiedene Seeds völlig unabhängige Pseudozufallszahlen ergeben?

+2

erforderlich sind, was Sie tun können, wenn Sie nicht über die RNG vertrauen (ein bisschen wie ein Hack, ich gebe) ist es, die Samen passieren der SHA1-Algorithmus von 'hashlib'; Das wurde entwickelt, um ähnliche Werte zu völlig unterschiedlichen zu mappen. –

+0

Ich habe diesen Effekt bemerkt, aber ich denke, es war in Microsoft C++, nicht in Python. Ich glaube, dass das "zufällige" Modul bessere Algorithmen verwendet. –

Antwort

2

Es wird definitionsgemäß eine Korrelation zwischen dem Seed und den erzeugten Zufallszahlen geben. Die Frage ist, ob der Randomisierungsalgorithmus ausreichend ist, um Ergebnisse zu liefern, die nicht korreliert sind, und Sie sollten die Methoden zur Bewertung der Zufälligkeit untersuchen, um diese Frage zu beantworten.

Sie haben jedoch Recht, besorgt zu sein. Hier sind die Ergebnisse von Microsofts C++ rand Funktion mit Seed-Werten von 0 bis 9:

38 7719 21238 2437 8855 11797 8365 32285 10450 30612 
    41 18467 6334 26500 19169 15724 11478 29358 26962 24464 
    45 29216 24198 17795 29484 19650 14590 26431 10705 18316 
    48 7196 9294 9091 7031 23577 17702 23503 27217 12168 
    51 17945 27159 386 17345 27504 20815 20576 10960 6020 
    54 28693 12255 24449 27660 31430 23927 17649 27472 32640 
    58 6673 30119 15745 5206 2589 27040 14722 11216 26492 
    61 17422 15215 7040 15521 6516 30152 11794 27727 20344 
    64 28170 311 31103 25835 10443 497 8867 11471 14195 
    68 6151 18175 22398 3382 14369 3609 5940 27982 8047 
+0

'Rand' ist auf einigen Plattformen notorisch unzuverlässig. Pythons "random" -Modul verwendet einen Mersenne-Twister-Algorithmus, der für Kryptographie als nicht gut genug erachtet wird, aber viel besser als die meisten Implementierungen von 'rand'. –

0

Zuerst: Ähnlichkeit definieren. Als nächstes: Code einen Ähnlichkeitstest. Dann: auf Ähnlichkeit prüfen.

Mit nur einer vagen Beschreibung der Ähnlichkeit ist es schwer zu überprüfen.

0

Welche Art von Simulation machst du?

Für Simulationszwecke ist Ihr Argument gültig (abhängig von der Art der Simulation), aber wenn Sie es in einer anderen Umgebung als Simulation implementieren, könnte es leicht gehackt werden, wenn es Sicherheitsbedenken bezüglich der Umgebung gibt die generierten Zufallszahlen.

Wenn Sie das Ergebnis einer Maschine simulieren, ob es für die Gesellschaft schädlich ist oder nicht, dann wird das Ergebnis Ihrer Ergebnisse nicht akzeptabel sein. Es erfordert maximale Zufälligkeit in jeder möglichen Weise und ich würde niemals Ihrer Argumentation vertrauen.

0

die Dokumentation aus dem Zufall Modul zu zitieren:

Allgemeinen Hinweise zu dem zugrunde liegenden Mersenne-Twister-Kern-Generator:

  • Der Zeitraum ist 2 ** 19937-1.
  • Es ist einer der am umfassendsten getesteten Generatoren.

würde ich mehr Sorgen um meinen Code sein gebrochen, als mein RNG nicht zufällig genug. Im Allgemeinen werden deine Bauchgefühle über Zufälligkeit falsch sein - der menschliche Geist ist wirklich gut darin, Muster zu finden, auch wenn sie nicht existieren.

Solange Sie wissen, dass Ihre Ergebnisse aufgrund fehlender zufälliger Aussaat nicht "sicher" sein werden, sollten Sie in Ordnung sein.

+0

Entschuldigung, was meinst du damit: "deine Ergebnisse werden aufgrund deines Mangels an zufälligem Seeding nicht 'sicher' sein?" Was meinst du mit "sicher"? Und sagst du tatsächlich, dass es wegen meiner sequentiellen Seeding nicht sicher ist? Es scheint widersprüchlich zu dem, was Sie zuvor über das zufällige Modul gesagt haben, das vertrauenswürdig ist ... –

+0

@Homero: Ich meine, wenn Sie diese Zufälligkeit für irgendeine Art von Sicherheitszwecken verwenden, sind Sie für jeden anfällig, der Ihre Seeding-Methode kennt . Wenn, OTOH, Sie eine Art von Simulation ausführen und nur reproduzierbare Ergebnisse wollen, sollten Sie "genug" Zufälligkeit bekommen. –

+1

-1 weil die Frage war, wie sich eine Folge von korrelierten Samen auf die Qualität der erzeugten Zufallszahlen auswirkt, nicht auf die Qualität der Zufallszahlen, wenn sie auf einem einzelnen Samen basieren. Diese Frage ist zum Beispiel relevant, wenn Sie am Anfang eines Multithread-Programms eine Reihe verschiedener Generatoren (möglicherweise eine pro Thread) erstellen. Sie möchten korrelierte Ergebnisse zwischen den Generatoren vermeiden. Ich denke @ Rossums Antwort ist ein guter Weg, dies zu tun. –

2

Wenn Sie sich Sorgen um sequenzielle Seeds machen, dann verwenden Sie keine sequentiellen Seeds. Richten Sie einen Master-RNG mit einem bekannten Startwert ein, und nehmen Sie dann aufeinanderfolgende Ausgaben von diesem Master-RNG, um die verschiedenen untergeordneten RNGs nach Bedarf zu säen.

Da Sie den Anfangswert für den Master-RNG kennen, kann die gesamte Simulation bei Bedarf genauso wie zuvor erneut ausgeführt werden.

masterSeed <- 42 
masterRNG <- new Random(masterSeed) 

childRNGs[] <- array of child RNGs 

foreach childRNG in childRNGs 
    childRNG.setSeed(masterRNG.next()) 
endforeach 
+1

Ich bin mir nicht sicher, ob das eine so gute Idee ist, weil Sie das Risiko eingehen, Samen zu duplizieren. Dies wäre beispielsweise sehr wahrscheinlich, wenn Sie 16-Bit-Zahlen generieren und Tausende von Prozessen ausführen. – Will

+0

Die Frage fragt nach sequentiellen Seeds, nicht nach doppelten Seeds. Wenn doppelte Seeds ein Problem darstellen, verwenden Sie eine 128-Bit-Blockchiffre und verschlüsseln Sie die Zahlen 0, 1, 2, 3, ... 2^128-1. Da es sich um eine Chiffre handelt, werden die Zahlen garantiert für eine sehr lange Zeit nicht dupliziert, bis der Zähler rollt. Ein anderer Schlüssel gibt eine andere Permutation der Zahlen. Um die Permutation zu duplizieren, verwenden Sie denselben Schlüssel. – rossum

1

Ich habe gefunden meßbare, aber klein, Korrelationen in Zufallszahlen aus dem Mersenne Twister erzeugt wird, wenn für mehrere Simulationen unter Verwendung von sequentieller seeds - deren Ergebnisse gemittelt werden Endergebnisse zu erhalten. In Python auf Linux gehen die Korrelationen weg, wenn ich die von der Zufallsfunktion des Systems erzeugten Zufallszahlen (Pseudozufallszahlen) über random.SystemRandom() verwende. Ich speichere SystemRandom-Nummern in Dateien und lese sie, wenn ein Seed in einer Simulation benötigt wird. generieren Samen:

import random 
myrandom = random.SystemRandom 
x = myrandom.random  # yields a number in [0,1) 
dump x out to file... 

Dann, wenn Samen

import random 
read x from file... 
newseed = int(x*(2**31)) # produce a 32 bit integer 
random.seed(newseed) 
nextran = random.random() 
nextran = random.random()... 
+0

Können Sie beschreiben, wie Sie Ähnlichkeit gemessen haben? –

+0

Ich kann nicht in meine spezielle Anwendung kommen, aber das Ergebnis war fast das Gegenteil von ähnlich - in der Nähe von Zufallszahlen (ein paar Anrufe auseinander) waren leicht negativ korreliert, wenn man weniger als eine kleine Anzahl (~ 0,01) war, dann waren die nächsten weniger als zufällig zufällig auch kleiner als diese kleine Zahl. Ich habe keine ausgiebigen Tests gemacht und bin hier vielleicht zu weit gegangen, aber es gab einen beständigen Trend in mehreren Fällen mit einer großen Anzahl von Simulationen mit sequentiellen Seeds. – BugFinder