Prolog: zufällige Permutation


Tofu

Ich versuche eine zufällige Permutation mit Prolog zu bekommen. Aber das Problem ist

?- permutation([1,2,3,4],L).

gibt immer L = [1, 2, 3, 4]als erste Antwort. Ich könnte dies mithilfe der Abfrage beheben

?- L1=[1,2,3,4], permutation(L1,L2), dif(L1,L2).

Aber das gibt mir immer L2 = [1, 2, 4, 3]als erste Antwort.

Wie kann ich eine zufällige Permutation in SWI Prolog erhalten?

David Tonhofer

Ist das nicht [1,2,3,4]zufällig genug? Sieht für mich zufällig aus!

Aber ich weiß, was du meinst - du willst eine Permutation, die zufälliger aussieht .

Warum nicht selbst rollen? Wählen Sie einfach das nächste Element aus einer immer kleiner werdenden "Eingabeliste".

Das ist etwas mühsam. Vielleicht gibt es elegantere Wege?

look_random_dammit([],[]) :- !.

% note that [PickedElement|PermutedList] APPENDS "PickedElement" 
% to list being constructed. Appending or prepending does not 
% really make a difference here though:

look_random_dammit(ListRemainder,[PickedElement|PermutedList]) :- 
   ListRemainder \== [],
   length(ListRemainder,Length),
   succ(Max,Length),  
   % We are now leaving logicland and asking an oracle to give
   % use a random number. "Buckle your seatbelt Dorothy, 'cause 
   % Kansas is going bye-bye!"
   random_between(0,Max,PickedIndex), 
   nth0(PickedIndex,ListRemainder,PickedElement),
   length(Prefix,PickedIndex),
   % Constructing a remainder list is probably slow
   append([Prefix,[PickedElement],Suffix],ListRemainder) , 
   append(Prefix,Suffix,ListRemainderNext),
   look_random_dammit(ListRemainderNext,PermutedList).

Und so:

?- look_random_dammit([1,2,3,4],P).
P = [2,3,1,4] ;
false.

?- look_random_dammit([],P).
P = [] ;
false.

?- look_random_dammit([1,1,1,2,2],P).
P = [2,1,1,2,1] ;
false.

Wenn wir auch die Informationen darüber beibehalten würden, welche Elemente in der Gleichung ausgewählt wurden, könnten wir ein Prädikat schreiben, das "die Permutation umkehrt", da beim Erstellen keine Informationen verloren gingen.

Verwandte Artikel


Zufällige Permutation von IntStream

Neuron: Hie und da ich mich mit indexierten Schleifen finden, für die ich den Auftrag zu einem gewissen zufälligen Reihenfolge vertauschen möge. Ich Übergang in der Regel von so etwas wie for (int i = 0; i < max; i++) { // do stuff with i } zu List<Intege

Zufällige Permutation jeder Zelle in einem Zellenarray

Haybert Markarian Ich habe ein 1- mal- 4- Zellen-Array D. Jedes der Zellelemente enthält 2 mal 2 Doppelmatrizen. Ich möchte eine zufällige Permutation über jede Matrix unabhängig durchführen, was dazu führt, dass ich das gleiche Zellenarray habe, Daber die Ele

Generieren Sie auf jedem Computer dieselbe zufällige Permutation

Gurkirat Singh Ich benutze die random_shuffleSequenz a1000 Mal. Ich möchte sicherstellen, dass auf jedem Computer die endgültige Reihenfolge gleich ist. Das mag unerwünscht aussehen, aber ich möchte es trotzdem erreichen. Stellt das srand(x)sicher? Pete Becker

Wie generiere ich eine zufällige Permutation in Java?

Shankar Raju: Was ist der beste Weg, um eine zufällige Permutation von n Zahlen zu erzeugen? Angenommen, ich habe eine Reihe von Zahlen 1, 2 und 3 (n = 3). Satz aller möglichen Permutationen: {123, 132, 213, 231, 312, 321} Wie generiere ich nun: eines der Elem

Zufällige Permutation von Zeilen eines großen Datensatzes

J Petersen Ich muss eine zufällige Permutation eines Datensatzes mit über 3 Millionen Zeilen erstellen. Ich habe versucht, PROC PLAN zu verwenden, basierend auf diesem Beispiel: http://support.sas.com/kb/23/977.html Laut diesem Artikel mit n = (Anzahl der Zeil