Rückgabe der zufälligen Ganzzahl aus dem Intervall basierend auf dem letzten Ergebnis und einem Saatgut
-
29-09-2020 - |
Frage
Angenommen, wir haben ein Intervall der Ganzzahl [A, B].Ich möchte eine Funktion haben, die zufällige Mitglieder aus dem Intervall ohne Wiederholungen zurückgibt.Sobald alle Mitglieder innerhalb des Intervalls erforscht werden, würde die Funktion in derselben Reihenfolge wieder dieselbe erste zufällige Reihenfolge zurückgeben.
Beispiel: a= 1, b= 5
generasacodicetagpre.Dies wäre leicht zu erreichen, indem ein Array aller Elemente zwischen A und B geschmiert wird, und wiederholt, wenn das Array abgeschlossen ist.Dies würde jedoch zu viel Speicherplatz dauern, und dies ist nicht für meinen Fall geeignet (ich könnte Millionen von Elementen haben).
stattdessen würde ich gerne mehr oder weniger so sein:
generasacodicetagpre.wo:
generasacodicetagpre.Der Trick weiß, dass er irgendwie eine nicht wiederholte Nummer aus dem Intervall basiert, das nur auf dem vor und dem Samen zurückgegebenen Element basiert.Am Ende würde es sich wie eine kreisförmige Liste verhalten, die bei seiner Initialisierung randomisiert ist, jedoch ohne Speicherplatz verwendet wird.
Lösung
Ich schlage vor, Sie sei eine zufällige Permutation im Bereich des Bereichs $ [A, B] $ , dh eine bijektive Funktion
Es gibt Standardmethoden zum Erzeugen einer solchen zufälligen Permutation in der Kryptographie-Literatur: Schauen Sie die Formatschutzverschlüsselung auf. Der Samen ist der kryptographische Schlüssel. Sie können in der Lage sein, $ \ PI (i) $ in $ O (1) $ Time und
Wenn Sie darauf bestehen, dass die nächste Ausgabe eine Funktion des vorherigen Ausgangs sein sollte, können Sie $ g (i)= i + 1 $ (außer das < Span-Klasse="Math-Container"> $ g (b)= a $ ), dann lassen Sie $ f (i)=pi ^ {- 1} (g (\ pi (i)) $ , wobei $ \ pi $ eine zufällige Permutation wie oben ausgewählt ist. Dadurch erhalten Sie einen zufälligen Zyklus, der iteratiert Durch die Elemente von $ [A, B] $ in einer zufälligen Reihenfolge. Die Ausgänge sind die Reihenfolge $ f (a) , f (f (a)), f (f (f (a)), \ dots $ .