Ich möchte nach dem Zufallsprinzip eine Permutation P
der ersten n natürlichen Zahlen erzeugen, und es muss die P[i] != i
für jede i<n
erfüllen.Wie erzeugt man zufällig eine Permutation P der ersten n natürlichen Zahlen, die P [i]! = I erfüllt?
Wie kann ich es effizient machen?
Die erste Methode, die ich gefunden habe, ist nur zufällig Zahlen für jede Position nach dem Zufallsprinzip zu wählen. Wie auch immer, ich glaube, es scheint nicht die Zufälligkeit zu garantieren.
Zum Beispiel im Fall von 4 Zahlen, wenn ich (zufällig) 2,3
für die ersten beiden Nummern wähle, dann könnte die Konfiguration für die letzten beiden Nummern entweder 0,1
oder 1,0
sein. Wenn ich für die ersten beiden die Option 1,2
wähle, dann ist die einzige verfügbare Option 3,0
, da das letzte Bit nicht 3
sein kann. So scheint es die Wahrscheinlichkeit von 1,2,3,0
ist doppelt so hoch wie 2,3,0,1
, oder?
Eine andere Sache zu tun ist zufällig eine Permutation zu generieren und ablehnen, wenn es die Bedingung nicht erfüllt, aber die Zeit Komplexität dafür kann nicht garantiert werden.
Was Sie bedeuten, "gleichmäßig verteilt". "zufällig" bedeutet nicht, dass die Wahrscheinlichkeiten gleich sind. – Henry
@Henry richtig, ich meinte "gleichmäßig verteilt" in der Tat – dontloo
Sie könnten eine [Fisher-Yates Shuffle] (https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle) verwenden, um die ursprüngliche Sequenz randomisieren. Falls ein Element falsch platziert ist, vertauschen Sie es mit seinem Nachbarn. Wenn mehr Elemente falsch platziert sind, führe einen zweiten Fisher-Yates Shuffle dieser Elemente durch. –