Der berühmte Fisher-Yates-Shuffle-Algorithmus kann verwendet werden, um ein Array A der Länge N zufällig zu permutieren:
For k = 1 to N
Pick a random integer j from k to N
Swap A[k] and A[j]
Ein häufiger Fehler, von dem mir immer wieder gesagt wurde, dass ich ihn nicht machen soll, ist folgender:
For k = 1 to N
Pick a random integer j from 1 to N
Swap A[k] and A[j]
Das heißt, anstatt eine zufällige Ganzzahl von k bis N auszuwählen, wählen Sie eine zufällige Ganzzahl von 1 bis N.
Was passiert, wenn Sie diesen Fehler machen? Ich weiß, dass die resultierende Permutation nicht gleichmäßig verteilt ist, aber ich weiß nicht, welche Garantien es für die resultierende Verteilung gibt. Hat jemand einen Ausdruck für die Wahrscheinlichkeitsverteilungen über die Endpositionen der Elemente?
Antworten:
Ein empirischer Ansatz.
Lassen Sie uns den fehlerhaften Algorithmus in Mathematica implementieren:
Ermitteln Sie nun, wie oft sich jede Ganzzahl an jeder Position befindet:
Nehmen wir drei Positionen in den resultierenden Arrays und zeichnen die Häufigkeitsverteilung für jede Ganzzahl an dieser Position:
Für Position 1 lautet die Frequenzverteilung:
Für Position 5 (Mitte)
Und für Position 10 (letzte):
und hier haben Sie die Verteilung für alle Positionen zusammen geplottet:
Hier haben Sie eine bessere Statistik über 8 Positionen:
Einige Beobachtungen:
Sie können diese Eigenschaften visualisieren, indem Sie den Anfang aller Linien vom selben Punkt (erste Eigenschaft) und der letzten horizontalen Linie (dritte Eigenschaft) betrachten.
Die zweite Eigenschaft ist aus dem folgenden Beispiel für eine Matrixdarstellung ersichtlich, in der die Zeilen die Positionen, die Spalten die Insassenzahl und die Farbe die experimentelle Wahrscheinlichkeit darstellen:
Für eine 100x100-Matrix:
Bearbeiten
Nur zum Spaß habe ich die genaue Formel für das zweite diagonale Element berechnet (das erste ist 1 / n). Der Rest kann erledigt werden, aber es ist viel Arbeit.
Verifizierte Werte von n = 3 bis 6 ({8/27, 57/256, 564/3125, 7105/46656})
Bearbeiten
Wenn wir die allgemeine explizite Berechnung in der Antwort von @wnoise ein wenig ausarbeiten, können wir ein wenig mehr Informationen erhalten.
Wenn wir 1 / n durch p [n] ersetzen, damit die Berechnungen nicht bewertet werden, erhalten wir beispielsweise für den ersten Teil der Matrix n = 7 (klicken, um ein größeres Bild zu sehen):
Nachdem wir mit den Ergebnissen für andere Werte von n verglichen haben, können wir einige bekannte ganzzahlige Sequenzen in der Matrix identifizieren:
Sie können diese Sequenzen (in einigen Fällen mit unterschiedlichen Zeichen) in der wunderbaren http://oeis.org/ finden.
Das allgemeine Problem zu lösen ist schwieriger, aber ich hoffe, dies ist ein Anfang
quelle
Der "häufige Fehler", den Sie erwähnen, ist das Mischen durch zufällige Transpositionen. Dieses Problem wurde von Diaconis und Shahshahani bei der Erzeugung einer zufälligen Permutation mit zufälligen Transpositionen (1981) ausführlich untersucht . Sie führen eine vollständige Analyse der Stoppzeiten und der Konvergenz zur Gleichmäßigkeit durch. Wenn Sie keinen Link zum Papier erhalten, senden Sie mir bitte eine E-Mail und ich kann Ihnen eine Kopie weiterleiten. Es macht wirklich Spaß zu lesen (wie die meisten Artikel von Persi Diaconis).
Wenn das Array wiederholte Einträge hat, ist das Problem etwas anders. Als schamloser Plug wird dieses allgemeinere Problem von mir, Diaconis und Soundararajan in Anhang B einer Faustregel für das Mischen von Riffeln (2011) angesprochen .
quelle
Sagen wir
a = 1/N
b = 1-a
i
Swaps für dask
th-Element. dh die Antwort auf die Frage "Wo istk
nachi
Swaps?". Zum Beispiel B 0 (3) =(0 0 1 0 ... 0)
und B 1 (3) =(a 0 b 0 ... 0)
. Was Sie wollen, ist B N (k) für jedes k.Dann,
Da jedoch B N (k = 1..N) die Identitätsmatrix bildet, ist die Wahrscheinlichkeit, dass sich ein gegebenes Element i am Ende an Position j befindet, durch das Matrixelement (i, j) der Matrix gegeben:
Zum Beispiel für N = 4:
Als Diagramm für N = 500 (Farbstufen sind 100 * Wahrscheinlichkeit):
Das Muster ist für alle N> 2 gleich:
quelle
Ich wusste, dass ich diese Frage schon einmal gesehen hatte ...
" Warum führt dieser einfache Shuffle-Algorithmus zu voreingenommenen Ergebnissen? Was ist ein einfacher Grund? " Die Antworten enthalten viele gute Informationen, insbesondere einen Link zu einem Blog von Jeff Atwood über Coding Horror .
Wie Sie vielleicht bereits erraten haben, hängt die genaue Verteilung basierend auf der Antwort von @belisarius stark von der Anzahl der zu mischenden Elemente ab. Hier ist Atwoods Handlung für ein 6-Elemente-Deck:
quelle
Was für eine schöne Frage! Ich wünschte ich hätte eine vollständige Antwort.
Fisher-Yates ist schön zu analysieren, denn sobald es sich für das erste Element entscheidet, lässt es es in Ruhe. Der Voreingenommene kann ein Element wiederholt an jedem Ort ein- und auswechseln.
Wir können dies genauso analysieren wie eine Markov-Kette, indem wir die Aktionen als stochastische Übergangsmatrizen beschreiben, die linear auf Wahrscheinlichkeitsverteilungen wirken. Die meisten Elemente werden alleine gelassen, die Diagonale beträgt normalerweise (n-1) / n. Wenn sie bei Pass k nicht alleine gelassen werden, werden sie mit Element k (oder einem zufälligen Element, wenn sie Element k sind) getauscht. Dies ist 1 / (n-1) in Zeile oder Spalte k. Das Element in Zeile und Spalte k ist ebenfalls 1 / (n-1). Es ist einfach genug, diese Matrizen für k von 1 bis n zu multiplizieren.
Wir wissen, dass das Element an der letzten Stelle wahrscheinlich gleich irgendwo war, da der letzte Durchgang die letzte Stelle gleich wahrscheinlich mit einem anderen tauscht. In ähnlicher Weise wird das erste Element wahrscheinlich überall platziert. Diese Symmetrie ist darauf zurückzuführen, dass die Transponierte die Reihenfolge der Matrixmultiplikation umkehrt. Tatsächlich ist die Matrix in dem Sinne symmetrisch, dass Zeile i dieselbe wie Spalte (n + 1 - i) ist. Darüber hinaus zeigen die Zahlen nicht viel offensichtliches Muster. Diese genauen Lösungen stimmen mit den von belisarius durchgeführten Simulationen überein: In Slot i nimmt die Wahrscheinlichkeit ab, j zu erhalten, wenn j auf i steigt, seinen niedrigsten Wert bei i-1 erreicht und dann bei i auf seinen höchsten Wert springt abnehmend bis j n erreicht.
In Mathematica habe ich jeden Schritt mit generiert
(Ich habe es nirgendwo dokumentiert gefunden, aber die erste Übereinstimmungsregel wird verwendet.) Die endgültige Übergangsmatrix kann berechnet werden mit:
ListDensityPlot
ist ein nützliches Visualisierungswerkzeug.Bearbeiten (von belisarius)
Nur eine Bestätigung. Der folgende Code enthält dieselbe Matrix wie in der Antwort von @ Eelvex:
quelle
Die Wikipedia-Seite zum Fisher-Yates-Shuffle enthält eine Beschreibung und ein Beispiel dafür, was genau in diesem Fall passieren wird.
quelle
Sie können die Verteilung mit stochastischen Matrizen berechnen . Die Matrix A (i, j) beschreibe die Wahrscheinlichkeit, dass die Karte ursprünglich an Position i an Position j endet. Dann hat der k-te Swap eine Matrix Ak, die durch
Ak(i,j) = 1/N
ifi == k
oder gegebenj == k
ist (die Karte in Position k kann überall landen und jede Karte kann mit gleicher Wahrscheinlichkeit an Position k landen),Ak(i,i) = (N - 1)/N
für allei != k
(jede andere Karte bleibt an derselben Stelle mit Wahrscheinlichkeit (N-1) / N) und alle anderen Elemente Null.Das Ergebnis des vollständigen Mischens ergibt sich dann aus dem Produkt der Matrizen
AN ... A1
.Ich gehe davon aus, dass Sie nach einer algebraischen Beschreibung der Wahrscheinlichkeiten suchen. Sie können eines erhalten, indem Sie das obige Matrixprodukt erweitern, aber ich kann mir vorstellen, dass es ziemlich komplex sein wird!
UPDATE: Ich habe gerade die entsprechende Antwort von wnoise oben gesehen! Hoppla...
quelle
Ich habe mich weiter damit befasst und es stellt sich heraus, dass diese Verteilung ausführlich untersucht wurde. Der Grund, warum es von Interesse ist, ist, dass dieser "kaputte" Algorithmus im RSA-Chip-System verwendet wird (oder wurde).
Elchanan Mossel, Yuval Peres und Alistair Sinclair untersuchen in Shuffling by semi-random transpositions dies und eine allgemeinere Klasse von Shuffles. Das Ergebnis dieses Papiers scheint zu sein, dass es
log(n)
unterbrochene Mischvorgänge erfordert, um eine nahezu zufällige Verteilung zu erreichen.In The Bias of Three Pseudorandom Shuffles ( Aequationes Mathematicae , 22, 1981, 268-292) analysieren Ethan Bolker und David Robbins dieses Shuffle und stellen fest, dass der gesamte Variationsabstand zur Gleichmäßigkeit nach einem einzelnen Durchgang 1 beträgt, was darauf hinweist, dass es nicht sehr ist überhaupt zufällig. Sie geben auch asympotische Analysen.
Schließlich fanden Laurent Saloff-Coste und Jessica Zuniga eine schöne Obergrenze in ihrer Untersuchung inhomogener Markov-Ketten.
quelle
Diese Frage bittet um eine interaktive visuelle Matrixdiagrammanalyse des erwähnten gebrochenen Shuffle. Ein solches Tool finden Sie auf der Seite Wird es mischen? - Warum zufällige Komparatoren von Mike Bostock schlecht sind .
Bostock hat ein hervorragendes Tool zur Analyse von Zufallskomparatoren zusammengestellt. Wählen Sie in der Dropdown-Liste auf dieser Seite einen naiven Austausch (zufällig ↦ zufällig) , um den fehlerhaften Algorithmus und das von ihm erzeugte Muster anzuzeigen .
Seine Seite ist informativ, da man sehen kann, welche unmittelbaren Auswirkungen eine Änderung der Logik auf die gemischten Daten hat. Zum Beispiel:
Dieses Matrixdiagramm mit einem ungleichmäßigen und sehr voreingenommenen Shuffle wird mit einem naiven Swap (wir wählen von "1 bis N") mit folgendem Code erstellt:
Wenn wir jedoch ein nicht voreingenommenes Shuffle implementieren, bei dem wir zwischen "k und N" wählen, sollten wir ein Diagramm wie das folgende sehen:
wobei die Verteilung einheitlich ist und aus Code wie dem folgenden erstellt wird:
quelle
Die hervorragenden Antworten, die bisher gegeben wurden, konzentrieren sich auf die Verteilung, aber Sie haben auch gefragt: "Was passiert, wenn Sie diesen Fehler machen?" - was ich noch nicht beantwortet habe, deshalb werde ich eine Erklärung dazu geben:
Der Knuth-Fisher-Yates-Shuffle-Algorithmus wählt 1 von n Elementen aus, dann 1 von n-1 verbleibenden Elementen und so weiter.
Sie können es mit zwei Arrays a1 und a2 implementieren , wo Sie ein Element aus a1 entfernen und in a2 einzufügen, aber der Algorithmus tut es an Ort und Stelle (was bedeutet, dass es nur ein Array benötigt), wie erklärt sich hier (Google: " Mischalgorithmen Fisher-Yates DataGenetics ") sehr gut.
Wenn Sie die Elemente nicht entfernen, können sie erneut zufällig ausgewählt werden, wodurch die voreingenommene Zufälligkeit entsteht. Dies ist genau das, was das zweite Beispiel, das Sie beschreiben, bewirkt. Das erste Beispiel, der Knuth-Fisher-Yates-Algorithmus, verwendet eine Cursor-Variable von k bis N, die sich merkt, welche Elemente bereits aufgenommen wurden, und daher vermeidet, Elemente mehr als einmal auszuwählen.
quelle