Python vs Oktav Zufallsgenerator

8

Genauer gesagt, numpy:

%Vor%

Oktave:

%Vor%

Octave behauptet, denselben Algorithmus auszuführen (Mersenne Twister mit einer Periode von 2 ^ {19937-1})

Weiß jemand, warum der Unterschied?

    
phil0stine 06.12.2012, 00:36
quelle

3 Antworten

8

Leider erlaubt es der Generator MT19937 in Octave nicht, ihn mit einer einzelnen 32-Bit-Ganzzahl zu initialisieren, wie es np.random.RandomState(4) tut. Wenn Sie rand("seed",4) verwenden, wird tatsächlich zu einer früheren Version des PRNG gewechselt, die zuvor in Octave verwendet wurde, wobei PRNG nicht MT19937 ist, sondern Fortran RANDLIB .

Es ist möglich, die gleichen Zahlen in NumPy und Octave zu erhalten, aber Sie müssen den Zufalls-Seed-Generierungsalgorithmus in Octave hacken und Ihre eigene Funktion schreiben, um den Zustandsvektor aus dem anfänglichen 32-Bit-Integer-Seed zu konstruieren. Ich bin kein Octave-Guru, aber mit mehreren Internet-Recherchen zu Bitmanipulationsfunktionen und Integer-Klassen in Octave / Matlab konnte ich das folgende grobe Skript schreiben, um das Seeding zu implementieren:

%Vor%

Benutze es so:

%Vor%

Nur zum Vergleich mit NumPy:

%Vor%

Die Zahlen (oder mindestens die ersten fünf) stimmen überein.

Beachten Sie, dass der Standard-Zufallszahlengenerator in Python, bereitgestellt vom random -Modul, ebenfalls MT19937 ist, aber einen anderen Seeding-Algorithmus verwendet, so dass random.seed(4) einen völlig anderen Zustandsvektor erzeugt und daher die PRN-Sequenz ist anders.

    
Hristo Iliev 14.12.2012, 10:17
quelle
2

Wenn Sie sich die Details des Mersenne Twister-Algorithmus ansehen, gibt es viele Parameter, die sich auf die tatsächlich produzierten Zahlen auswirken . Ich glaube nicht, dass Python und Octave versuchen, die gleiche Zahlenfolge zu erzeugen.

    
Ned Batchelder 06.12.2012 01:14
quelle
-1

Es sieht so aus, als ob numpy die rohen, zufälligen Integer zurückgibt, während Octave sie normalisiert, um zwischen 0 und 1.0 zu floaten.

    
DaveP 06.12.2012 00:54
quelle

Tags und Links