2010-05-20 10 views
7

Ich brauche einen guten Pseudozufallszahlengenerator, der wie eine reine Funktion aus seiner vorherigen Ausgabe ohne Verstecken des Zustands berechnet werden kann. Unter „gut“ Ich meine:Gibt es "gute" PRNG, die Werte ohne versteckten Zustand erzeugen?

  1. muss ich in der Lage sein Generator in einer solchen Art und Weise parametrisieren, dass es für 2^n Iterationen mit beliebigen Parametern (oder mit einigen großen Teilmenge davon) laufen alle oder fast alle Werte abdecken sollte zwischen 0 und 2^n - 1, wobei n die Anzahl der Bits im Ausgabewert ist.

  2. Combined Generatorleistung von n + p Bits müssen alle abdecken oder fast alle Werte zwischen 0 und 2^(n + p) - 1 wenn ich laufe es für 2^n Iterationen für jede mögliche Kombination der Parameter, wo p die Anzahl der Bits in Parameter ist.

beispielsweise LCG kann wie eine reine Funktion berechnet werden, und es kann erste Bedingung erfüllen, aber es kann nicht die zweite erfüllen. Sagen wir, wir haben 32-Bit-LCG, m = 2^32 und es ist konstant, unsere p = 64 (zwei 32-Bit-Parameter a und c), n + p = 96, so müssen wir Daten von drei Ints von Ausgabe zu peek, um zweite Bedingung zu erfüllen. Bedauerlicherweise kann die Bedingung nicht erfüllt werden, da die Abfolge von ungeraden und geraden Eingängen in der Ausgabe streng alterniert. Um dies zu überwinden, muss ein versteckter Zustand eingeführt werden, aber das macht die Funktion nicht rein und bricht die erste Bedingung (lange versteckte Periode).

EDIT: Streng genommen, möchte ich Familie von p Bits und mit vollen Zustand von n Bits parametrisiert Funktionen, die jeweils alle möglichen Binärketten von p + n Bits in einer einzigartigen „randomish“ Art und Weise zu erzeugen, nicht nur kontinuierlich (p + n) erhöht wird - Bit int. Parametrisierung erforderlich, um diesen einzigartigen Weg zu wählen.

Will ich zu viel?

+0

Sie wollen einen Zufallszahlengenerator, um eine fast eindeutige Sequenz zu erzeugen? –

+0

@Moron, ja. Der Generator sollte in der Lage sein, alle oder fast alle möglichen unterschiedlichen Bitfolgen vordefinierter Länge L in mehreren Durchläufen mit verschiedenen Parametern zu erzeugen, die nicht mehr als 2^n Iterationen für jeden Lauf machen, wobei n actual

+2

Wenn Sie in k-Aufrufen k eindeutige Zahlen erwarten, ist es überhaupt nicht zufällig. Für z.B. Ich kann immer den letzten vorhersagen! Oder habe ich falsch verstanden? –

Antwort

1

Versuchen
Alles, was Sie brauchen, ist Liste der primitiven Polynome.
Periode der Generierung endlichen Feldes auf diese Weise, erzeugt Feld der Größe 2^n-1. Aber Sie können diesen Vorgang verallgemeinern, um alles mit der Periode von k^n-1 zu erzeugen.

Ich habe nicht gesehen, dies umgesetzt, aber alles, was Sie implementieren müssen, ist Zahlen, die durch kleine Anzahl s Verschiebung> n, wobei ggT (s, 2^n-1) == 1. gcd steht für größten gemeinsamen Teiler

+0

Wie ich es verstehe, gibt es eine Teilmenge von kombinierten Werten, die Nullen enthalten, die nicht generiert werden können. – actual

+0

Das ist wahr. Sie sollten die Unterstützung für Nullen manuell hinzufügen, wenn Sie sie benötigen, und einfach vom vordefinierten Wert für die Instanz 0x001 zu 0x000 und dann zurück zum nächsten Wert von 0x001 springen. –

2

Sie können jede Blockchiffre mit einem festen Schlüssel verwenden. Um die nächste Nummer zu generieren, entschlüsseln Sie die aktuelle, inkrementieren Sie sie und verschlüsseln Sie sie erneut. Da Blockchiffren 1: 1 sind, durchlaufen sie notwendigerweise jede Zahl in der Ausgabedomäne, bevor sie wiederholt werden.

+0

Interessante Idee, aber zu langsam für meine Anwendung. Trotzdem danke. – actual

+0

Hmm ... vielleicht nicht so langsam. Wie denkst du, wird es funktionieren, wenn ich Schlüssel der Breite p, nicht n + p, erzeugen werde, und XOR mit Daten von n + p Breite zu beginnen. Wird es alle Kombinationen von n + p Breite erzeugen? – actual

+0

Hängt davon ab, wo Sie die Daten bekommen. Grob gesagt, wird das wahrscheinlich keine Permutation erzeugen. –

Verwandte Themen