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.

War es hilfreich?

Lösung

Ich schlage vor, Sie sei eine zufällige Permutation im Bereich des Bereichs $ [A, B] $ , dh eine bijektive Funktion $ \ pi: [a, b] \ bis [a, b] $ . Warten Sie dann einen Zähler $ I $ Das startet bei $ i= A $ ; In jedem Schritt, Ausgang $ \ pi (i) $ und dann Inkrementieren $ i $ (umhüllen so Dieser $ B + 1 $ wird $ A $ ).

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 $ O (1) $ Raum, daher sollte dies sehr effizient sein und die Notwendigkeit einer Menge Speicherung vermeiden.

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 $ .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit cs.stackexchange
scroll top