Pseudozufällige Durchquerung eines Satzes

Ich habe gelesenGame Coding Complete (4. Ausgabe) und ich habe ein paar Probleme, den Pfad "Pseudo-Random Traversal of a Set" im Abschnitt "Grab Bag of Useful Stuff" in Kapitel 3 zu verstehen.

Haben Sie sich jemals gefragt, wie die Zufallstaste an Ihrem CD-Player funktioniert? Es wird jedes Lied auf Ihrer CD nach dem Zufallsprinzip abgespielt, ohne dass dasselbe Lied zweimal abgespielt wird. Dies ist eine sehr nützliche Lösung, um sicherzustellen, dass die Spieler in Ihren Spielen die unterschiedlichsten Funktionen wie Objekte, Effekte oder Charaktere sehen, bevor sie die gleichen wieder sehen können.

Nach dieser Beschreibung wird über eine Implementierung in C ++ gesprochen, die ich in Java implementiert habe, aber nicht erfolgreich replizieren konnte. Es beschreibt auch kurz, wie es funktioniert, aber ich verstehe es auch nicht.

ich fanddiese StackOverflow beantwortet eine ähnliche Frage, aber leider ist der Link zu Beispielen in der Antwort nicht mehr vorhanden und ich verstehe den Wikipedia-Artikel auch nicht, obwohl die Beschreibung dessen, was er tut, zu beschreiben scheint, wonach ich suche.

Um klar zu sein, bin ichnicht Suche nach einer Möglichkeit, eine Sammlung nach dem Zufallsprinzip neu zu ordnen. Ich suche nach einer Möglichkeit, ein Element aus einer Sammlung genau einmal zufällig auszuwählen, bevor ich es wiederhole.

Kann jemand erklären, wie dieses Verhalten funktioniert, und ein Beispiel in Java bereitstellen? Vielen Dank!

[BEARBEITEN] Ich dachte, es könnte nützlich sein, hier einen Auszug der Implementierung zu haben, um zu erklären, wovon ich spreche.

So funktioniert das. Ein Sprungwert wird berechnet, indem drei Zufallswerte größer als Null gewählt werden. Diese Werte werden zu den Koeffizienten des Quadrats, und der Domänenwert (x) wird auf den Ordnungswert der Menge gesetzt:

Skip = RandomA * (members * members) + (RandomB * members) + RandomC

Mit diesem Überspringwert können Sie diesen Code verwenden, um die gesamte Menge genau einmal in einer pseudozufälligen Reihenfolge zu durchlaufen:

nextMember += skip;
nextMember %= prime;

Der Wert von skip ist so viel größer als die Anzahl der Mitglieder Ihrer Gruppe, dass der gewählte Wert zufällig zu springen scheint. Natürlich befindet sich dieser Code in einer while-Schleife, um den Fall zu erfassen, dass der gewählte Wert größer als Ihre Menge, aber immer noch kleiner als die Primzahl ist.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage