On Nov 6, 7:48 pm, Paul Ebermann <
Paul-Eberm...@gmx.de> wrote:
> Karl-Uwe Frank skribis:
>
> > On Nov 5, 3:49 pm, Paul Ebermann <
Paul-Eberm...@gmx.de> wrote:
> >> Karl-Uwe Frank skribis:
> >>> Hier ein kurzes Beispiel für eine Zahlenreihe mit voller Periodenlänge
> >>> von M
>
> >>> Start IV (pqRNG)
> >>> Q = 0, P = 3, R = 13, M = 16
>
> >>> 7, 14, 9, 12, 3, 10, 5, 8, 15, 6, 1, 4, 11, 2, 13, 0
>
> >> Die anderen möglichen Reihen für dieses M sind (alle mit Q=0 endend):
> > Was logisch ist wenn ich mit Q=0 beginne, denn wenn die volle
> > Periodenlänge erreicht ist nimmt Q zwangsläufig wieder den Startwert
> > an.
>
> (Ja, der Klammer-Ausdruck war bloß, um klarzustellen, wie die Reihen
> ausgerichtet wurden.)
>
Ah, okay. Ich habe fest Laufweite für den Text eingestellt und daher
die Reihen sauber formatiert gesehen. Deshalb wohl das Missverständnis
mit der eingeklammerten Erläuterung.
[snip]
> >> Das noch "zufällig" zu nennen ist nicht glaubwürdig.
>
> > Völlig normal und zu erwarten, denn es sind ja auch Pseudo-
> > Zufallszahlen die hier erzeugt werden.
>
> Hmm, bei Pseudo-Zufall erwarte ich, dass es so aussieht wie Zufall. Und
> es sieht hier nicht wirklich so aus. Aber das mögen andere Leute anders
> sehen.
Na ja, also eine Zahlenreihe mit 16 unterschiedlichen Werten ist doch
wohl auch eher selten in der Realität anzutreffen wenn es um
Zufallszahlen geht. Bei größeren Wertebereichen sieht es schon sehr
schön zufällig aus.
> > Weiterhin ist es, in Anbetracht
> > der großen Anzahl möglicher Zahlenreihen unerheblich, da Q ja nicht
> > immer den Wert gleichen Startwert haben sollten.
>
> Den aktuellen Wert für Q kann man direkt aus der Ausgabe erhalten. Mit
> zwei weiteren Werten (die im obigen Beispiel für n = 4 jeweils nur ein
> Bit liefern, der Rest ist vorhersagbar) erhalten wir dann auch P und R.
>
> Als Beispiel: Ich sehe eine Ausgabe von 7. Dann muss der nächste Wert
> entweder 6 (für R = 5) oder 14 sein (für R = 13). Danach folgt dann
> entweder 1 (für P = 11) oder 9 (für P = 3).
> Danach kann man den Rest der Sequenz komplett vorhersagen.
>
> Das gilt auch rückwärts: Vor der 7 müssen entweder 8 (für P ⊕ R = 2)
> oder 0 (für P ⊕ R = 10) gekommen sein, davor 5 (für P = 11) oder 13 (für
> P = 3).
Das ist, wie ich finde, ein sehr gutes Beispiel dafür, wie man einen
LCG-ähnlichen PRNG "knacken" kann. Es stellt sich mir allerdings die
Frage, wie es aussieht, wenn M=2^31-1 ist? Kann dann immer noch so
leicht die ganze Sequenz errechnet werden? Theoretisch müsste es ja
möglich sein, da sich nur der Wertebereich vergrößert, die
Zahlenverhältnisse aber konstant bleiben.
> >>> Das Ergebnis von pqRNG in 32bit Binärwerten im Integer Interval [0,
> >>> 255] mit M =
2147483647
>
> >> Huh. Dieses M ist als ungerade Zahl sicher keine Zweierpotenz (das ist
> >> 2^31-1, wenn ich das richtig sehe), und das Intervall [0, 255] ist auch
> >> nicht groß genug für 32-bit Zahlen. Was genau hast du da getestet?
>
> > Dieses M ist zwangsläufig eine ungerade Zahl, wenn mit signed Int32
> > gerechnet wird.
>
> Einfaches Rechnen mit 32-Bit Integer Werten (mit Abschneiden von
> Übertrag-Bits) ist nicht das gleiche wie Rechnen modulo
2147483647,
> sondern modulo 2^32.
>
> Ich habe keine Ahnung, was du da wirklich implementiert und getestet hast.
>
Wie gesagt, bei signed Int32 kann ich keiner Variable 2^32 zuordnen,
daher 2^31-1. Trotzdem werden alle Integer jeweils einmal in einer
vollen Periode errechnet, was ich mehrfach ausprobiert habe. Den
Zähler als Int64 auf 2^32 setzen, Q, P und R als Int32 (Uint32 bietet
mein Compiler nicht an), dann M=0x7ffffff, alle Ergebnisse in mehrere
Dateien auf Platte schreiben, dann alles per MergeSort in eine
sortierte Datei und diese schichtweg seqenziell auf fehlende Werte und
Duplikate überprüfen. Es gab keine fehlenden Werte und keine Duplikate
in mehreren Testläufen mit unteschiedlichen Werten für Q, P und R. Bei
M=2^4, M=2^5, M=2^6, etc. ist das ja sehr einfach und schnell
nachzuprüfen.
> M =
2147483647 passt jedenfalls nicht zur Beschreibung M = 2^n im
> Algorithmus.
>
Wie gesagt, Int32 bietet mir keine andere Möglichkeit. Wähle ich für
Q, P und R Int64 und setze M=2^32 werden alle Werte von 0 bis 2^32
berechnet. Kann auch sehr einfach nachgeprüft werden.
Außerdem ist es doch wohl so, dass der Algorithmus, wenn er alle Werte
bei kleinem Modulo 2^n errechnet, dies auch bei größerem Modulo, z.B.
2^32 oder 2^64 tun wird. Das Verhältnis der Werte in der Formel
verändert sich ja nicht durch einen größeren Modulo, oder?
> > Aus meiner Sicht ist Q nur ein Art "Träger", aus dem die benötigten
> > Informationen extrahiert werden. Wenn also Byte benötigt werden, dann
> > greift folgende Formel
>
> > Byte = Q >> 23 and 0xff
>
> Okay, du ignorierst also die unteren Bits und extrahierst 8 Bit aus dem
> oberen Ende.
Ja, so seht es auch auf der Webseite bei den Testergebnissen, auch
wenn die Formel etwas anders geschrieben ist. Momentan favorisiere
ich
Byte = Q >> 24 , weil es eine weitere Rechenoperation erspart.
> Das solltest du unbedingt mit in die Beschreibung des Algorithmus
> hineinschreiben.
Das ist aber dann eine Einschränkung des Algorithmus, denn wie die
Werte von Q letztlich gehandhabt werden hängt doch von dem jeweiligen
Verwendungszweck ab. Bei Spielen werden sehr häufig nur Nullen und
Einsen benötigt, also berechne ich Byte = Q >> 30 & 0x1, bei anderen
Anwendungen werden Hex-Byte benötigt, dann gibt Byte = Q >> 24, bei
anderer Anwendung werden wieder andere Werte benötigt, die auf andere
Art aus Q gewonnen werden können. Da dies aber im Vorfeld unklar ist,
kann ich den Algorithmus nicht auf die eine oder andere Art festlegen.
> (So kommt natürlich das "abwechselnd gerade und
> ungerade" nicht mehr zum Tragen, und auch die Analyse, die ich oben für
> n = 3 gemacht habe, geht nicht mehr ganz so einfach.)
>
Es wäre schon interessant zu erfahren, ob und wie einfach man nur aus
der erzeugten Bytefolge auf die Werte für Q, P und R schließen kann.
Aber selbst wenn ich Dir nun 32 aufeinanderfolgende Werte von Q
benenne, denke ich, wird es Dir nicht so einfach fallen auf P und R zu
schließen, oder irre ich mich hier?
> >>> Anmerkung: Dieser PRNG kann nicht als kryptographisch sicher
> >>> betrachtet werden.
>
> >> Ja, und ich glaube nicht, dass das nur an mangelnder Analyse liegt.
>
> > Er ist nicht kryptographisch sicher, da er nicht als solcher
> > konzipiert ist.
>
> Das klang am Anfang anders, aber gut dass das klargestellt ist.
>
In der Anmerkung steht es ja, die Idee mit dem XOR war wohl etwas
vorschnell von mir gedacht, ist aber bereits entfernt.
> Für Simulationsexperimente mag dein PRNG ja nützlich sein.
>
Womit doch schon einmal eine sehr gute Einsatzmöglichkeit gefunden
wäre. :-)
Cheers,
Karl-Uwe