Kann ich einen deterministischen Shuffle in clojure machen?

8

Ich möchte einige Sätze mischen, die jedes Mal, wenn mein Programm ausgeführt wird, gleich sind:

Dies ist eine Möglichkeit, dies zu tun:

%Vor%

Aber es dauert eine Weile zu bewerten, und scheint verschwenderisch und ziemlich unelegant.

Gibt es eine Möglichkeit, shuffle 39038 direkt zu erzeugen, ohne die gesamte Sequenz zu erzeugen und zu konsumieren?

(Ich erkenne bereits, dass ich sie hart kodieren kann, oder bringe die Mühe zurück, um mit einem Makro die Zeit zu kompilieren. Das scheint auch ein bisschen Unsinn zu sein.)

    
John Lawrence Aspden 12.02.2013, 15:54
quelle

3 Antworten

3

Klingt so, als ob Sie Nummernumwandlungen :

möchten %Vor%

Versuchen wir es:

%Vor%

... wie in der Frage, aber ohne irgendeine der anderen Permutationen zu erzeugen.

Nun gut, aber würden wir sie alle bekommen?

%Vor%

Beachten Sie, dass die Permutationen in der Reihenfolge (lexikographisch nach Index) erzeugt werden:

%Vor%     
A. Webb 12.02.2013, 19:58
quelle
4

clojure.core/shuffle verwendet java.util.Collection/shuffle , was einen optionalen Zufallszahlengenerator erfordert. clojure.core/shuffle verwendet dieses Argument nicht, aber Sie könnten es verwenden, um eine Variante von shuffle zu erstellen, die ein zusätzliches Startwertargument benötigt, und mit diesem Startwert einen Zufallszahlengenerator erstellen, der an java.util.Collection/shuffle übergeben wird:

%Vor%     
ChrisBlom 08.09.2015 08:26
quelle
1

Meine Empfehlung: Verwenden Sie eine Schließung und berechnen Sie die Permutationen nur einmal. Verwenden Sie diese Permutationen dann erneut, um ein Element daraus auszuwählen. In Ihrer Funktion colour-shuffle werden die Permutationen für jeden Aufruf neu berechnet, der nicht sehr effizient ist.

%Vor%

Ausgabe:

%Vor%

Beachten Sie, dass der zweite Durchlauf mit select-permutation noch schneller ist. Dies liegt daran, dass Ergebnisse von Lazy-Sequenzen nach der Berechnung zwischengespeichert werden. Wird ein Element sehr tief in den Lazy-Seq geladen, werden alle vorhergehenden Elemente ebenfalls berechnet. Deshalb dauert der erste Lauf viel länger. Wenn das 39039. Element von einem frischen Lazy-Seq angefordert wird, werden mindestens 39040 Elemente berechnet (in Chucks von 32).

Übrigens, wenn Ihre Zufallszahlen sowieso hartcodiert werden, können Sie die oben abgerufenen Permutationen ebenfalls fest codieren.

    
Michiel Borkent 12.02.2013 16:24
quelle