2016-07-10 13 views
0

ich in einem Lua-Skript den folgenden PRNG bin mit:PRNGs und Startwerte

inputseed = {763261} 
seedobja = 1103515.245 
seedobjc = 12345 
seedobjm = 4294967.295 --0x100000000 

function srandom(seedobj, fVal1, fVal2) 
    seedobj[1] = mod(seedobj[1] * seedobja + seedobjc, seedobjm) 
    local temp_rand = seedobj[1]/(seedobjm - 1) 
    if (fVal2) then 
     return floor(fVal1 + 0.5 + temp_rand * (fVal2 - fVal1)) 
    elseif (fVal1) then 
     return floor(temp_rand * fVal1) + 1 
    else 
     return temp_rand 
    end 
end 

-- the returned value should be a float between 0 and 1 
local randomvalue_a = srandom(inputseed) 
-- the returned value should be an integer between 10 and 20 
local randomvalue_b = srandom(inputseed, 10, 20) 

Meine Frage ist, haben ähnliche Startwerte ähnliche Ergebnisse erzeugen, wenn sie wie diese durch eine PRNG laufen?

Ich meine, die Zahlen 3 und 5 sind nahe beieinander verglichen mit einer großen Zahl wie 3001. Sind die ersten beiden Zahlen wahrscheinlich ähnliche Pseudozufallswerte?

Danke.

+0

Dieser Generator sieht nicht richtig zu mir. Es scheint auf einer ganzzahligen LCG zu basieren, aber fälschlicherweise an Fließkomma angepasst. – sh1

Antwort

1

Lua hat nichts mit Frage zu tun.

Remember, Google loves us all.

Dies ist linear congruental Generator, auch mit zusätzlicher Pfeife in der dritten Zeile der Funktionsdefinition.

Wenn wir die Formeln auf Linie 2 und 3 anschauen, werden Sie sehen, dass x *a + b und x/(c-1) lineare Operationen sind, die genau Ihre Immobilie haben, aber auf der Linie 2 gibt es auch mod(x,c) Operation, die mit der Periode c tatsächlich periodisch linear ist . Also ist es linear periodisch. Das ist bis auf einige wenige Punkte linear.

Wenn Sie tatsächlich einen einfachen Test des Algorithmus durchführen. (z. B. here), Sie werden sehen, dass für Parameter gegeben der Zeitraum etwa 3 oder 4 ist.

Das ist für Werte wie 3 und 3.1 sind die Ergebnisse nahe, aber auch Ergebnisse für 3 und 6.87.


Diese hohe Periode BTW, bedeutet, dass Ihr Generator falsch ist. Da Sie die Generatorausgänge an sich selbst speisen sollten, möchten Sie, dass sie nicht linear in der Reichweite der Ausgänge liegen (ihre Periode muss für Ausgänge im Bereich von (0,1) deutlich kleiner als 1 sein).

Dazu muss der Nenner in der Mod-Funktion niedriger als der Zähler sein. In Ihrem Fall müssen die seedobjc und seedobjm getauscht werden.

+0

Auch wenn @ sh1 notiert, ist der Generator falsch, wenn er seinen eigenen Ausgang erhält, konvergiert er monoton um einen zehnten Schritt auf einen spezifischen Wert. – Dimitry

+0

Ich verstehe nicht, was ich tun muss. (Außerdem habe ich am Ende des Beispiels ein paar Codezeilen hinzugefügt, um zu zeigen, wie ich die Funktion verwende.) – posfan12

+0

Ist diese Funktion besser? http://Stackoverflow.com/a/18725427/330663 Ich habe total vergessen, dass ich dieses Thema begann. – posfan12

1

Für die meisten PRNGs ist es sehr unwahrscheinlich, dass ähnliche Samen ähnliche Ergebnisse liefern. Wenn Sie mehrere Samen benötigen, sind benachbarte Ganzzahlen die ideale Wahl, da es einfach ist, zu beweisen, dass sie alle verschieden sind des PRNG-Designers (obwohl es ihnen möglich ist, ihren Job schlecht gemacht zu haben).

Für diesen speziellen Generator sollten Sie wahrscheinlich nur durch die Arithmetik gehen und sehen, was Sie bekommen. Wenn es richtig funktioniert, sollten Sie sehen, dass die Seeds 3 und 5 genauso schnell divergieren wie 3 und 3001.