Wie funktioniert Shuffle from Random in Python?
Ich frage, weil es sehr schnell funktioniert. Wenn ich versuche, Shuffle zu schreiben, funktioniert es 1 Minute für 10 ^ 6 Elemente, aber Python Shuffle macht das in 8 Sekunden?
Wie funktioniert Shuffle from Random in Python?
Ich frage, weil es sehr schnell funktioniert. Wenn ich versuche, Shuffle zu schreiben, funktioniert es 1 Minute für 10 ^ 6 Elemente, aber Python Shuffle macht das in 8 Sekunden?
Antworten:
Pythons random.shuffle
verwendet das Fisher-Yates-Shuffle , das in O (n) -Zeit ausgeführt wird und sich als perfektes Shuffle erwiesen hat (unter der Annahme eines guten Zufallszahlengenerators).
Es iteriert das Array vom letzten zum ersten Eintrag und wechselt jeden Eintrag mit einem Eintrag an einem zufälligen Index darunter.
Der grundlegende Vorgang des Fisher-Yates-Mischens ähnelt dem zufälligen Auswählen nummerierter Tickets aus einem Hut oder Karten aus einem Deck nacheinander, bis keine mehr übrig sind. Der spezifische Algorithmus bietet eine Möglichkeit, dies auf effiziente und strenge Weise numerisch zu tun, was bei richtiger Ausführung ein unvoreingenommenes Ergebnis garantiert ...
Die moderne ... Lösung besteht darin, die "getroffenen" Zahlen an das Ende der Liste zu verschieben, indem sie bei jeder Iteration gegen die letzte nicht getroffene Zahl ausgetauscht werden. Dies reduziert die zeitliche Komplexität des Algorithmus auf O (n) im Vergleich zu O (n 2 ) für die naive Implementierung. Diese Änderung ergibt den folgenden Algorithmus (für ein Array auf Nullbasis).
To shuffle an array a of n elements (indices 0..n-1): for i from n − 1 downto 1 do j ← random integer with 0 ≤ j ≤ i exchange a[j] and a[i]