Ich habe zwei Möglichkeiten, eine Liste von Elementen in zufälliger Reihenfolge zu erstellen und möchte feststellen, ob sie gleichermaßen fair (unvoreingenommen) sind.
Die erste Methode, die ich verwende, besteht darin, die gesamte Liste der Elemente zu erstellen und sie dann zu mischen (z. B. eine Fisher-Yates-Mischung). Die zweite Methode ist eher eine iterative Methode, bei der die Liste bei jeder Einfügung gemischt wird. Im Pseudocode lautet die Einfügefunktion:
insert( list, item )
list.append( item )
swap( list.random_item, list.last_item )
Ich bin daran interessiert, wie man die Fairness dieses speziellen Mischens demonstriert. Die Vorteile dieses Algorithmus, wo er verwendet wird, reichen aus, dass es in Ordnung wäre, auch wenn er etwas unfair ist. Um zu entscheiden, brauche ich einen Weg, um seine Fairness zu bewerten.
Meine erste Idee ist, dass ich die auf diese Weise möglichen Gesamtpermutationen im Vergleich zu den für eine Menge der endgültigen Länge möglichen Gesamtpermutationen berechnen muss. Ich bin jedoch ein bisschen ratlos darüber, wie man die Permutationen berechnet, die sich aus diesem Algorithmus ergeben. Ich kann auch nicht sicher sein, ob dies der beste oder einfachste Ansatz ist.
quelle
Antworten:
Lassen Sie uns zunächst zwei vielleicht offensichtliche, aber wichtige Annahmen machen:
_.random_item
kann die letzte Position wählen._.random_item
wählt jede Position mit der Wahrscheinlichkeit .Um die Korrektheit Ihres Algorithmus zu beweisen, benötigen Sie ein induktives Argument ähnlich dem hier verwendeten :
Ab hier ist der Beweis falsch. Einen korrekten Beweis finden Sie weiter unten. Ich lasse dies hier, weil sowohl der Fehler als auch die folgenden Schritte (die stichhaltig sind) lehrreich sein könnten.
Es ist nützlich, eine lokale (dh elementweise) Eigenschaft abzuleiten, die gelten muss, da es schmerzhaft ist, über die gesamte Permutation zu streiten. Beachten Sie, dass eine Permutation gleichmäßig gewählt wird, wenn jedes Element die gleiche Wahrscheinlichkeit hat, sich an jeder Position zu befinden, d. H
wound wir nehmen aus Gründen der Vereinfachung der Notation an, dass wir in die Liste einfügen .{ 1 , … , n }n=|L| {1,…,n}
Lassen Sie uns nun sehen, was Ihre Technik macht, wenn Sie das te Element einfügen . Wir müssen drei Fälle berücksichtigen (nach dem Tausch):n+1
Für jeden Fall berechnen wir die Wahrscheinlichkeit, dass sich das Element an Position ; alle müssen sich als herausstellen (was wegen ausreicht ). Sei die Wahrscheinlichkeit, dass sich eines der ersten Elemente an einer beliebigen Position in der alten Liste befindet (Induktionshypothese), und die Wahrscheinlichkeit von jede Position, die gewählt wird von (Annahmen 1, 2). Beachten Sie, dass der Koex der Liste mit Elementen und die Auswahl der Swap-Position unabhängige Ereignisse sind , sodass die Wahrscheinlichkeiten gemeinsamer Ereignisse zi 1j i (1)pn=11n+1 (1) npn=1pn=1n n nps=1n+1 n
random_item
für . Nun zu den Berechnungen.i,j∈{1,…,n}
Wir betrachten nur die alten Elemente. Ein solches Element befindet sich an Positionjn j i i
Das neue Element landet genau dann an Position wenn als Swap-Position gewählt wurdeichi i
Alles in allem hat sich herausgestellt, dass Ihre Einfügestrategie tatsächlich die Einheitlichkeit bewahrt. Induziert beweist dies, dass Ihr Algorithmus gleichmäßig verteilte Permutationen erzeugt.
Ein Wort der Warnung: Dieser Beweis bricht zusammen, wenn die eingefügten Elemente nicht paarweise unterschiedlich sind bzw. unterscheidbar, weil dann die allererste Gleichung nicht mehr gültig ist. Ihr Algorithmus ist jedoch weiterhin gültig. Jede Permutation mit Duplikaten wird durch die gleiche Anzahl zufälliger Ausführungen generiert. Sie können dies beweisen, indem Sie Duplikate markieren (dh sie unterscheidbar machen), den obigen Beweis durchführen und die Markierungen (virtuell) entfernen. Im letzten Schritt werden gleich große Sätze von Permutationen zu denselben reduziert.
Wie Steven in den Kommentaren richtig bemerkt hat, ist der obige Beweis von Grund auf fehlerhaft, da nicht zutrifft; Sie können Verteilungen auf der Menge der Permutationen konstruieren, die die rechte, aber nicht die linke Seite erfüllen¹.(1)
Daher müssen wir mit Permutationswahrscheinlichkeiten arbeiten, was sich schließlich als nicht so schlecht herausstellt. Die Annahmen zuL(k) {1,…,k}
random_item
und die induktive Struktur, die zu Beginn des Beitrags beschrieben wurden, bleiben bestehen, wir fahren von dort fort. Let die Liste bezeichnen , nachdem eingefügt wurde. { 1 , … , k }Es sei eine beliebige Permutation von . Es kann eindeutig als geschrieben werdenπ′∈Permn+1 {1,…,n+1}
für einige und . Nach Induktionshypothese ist . Außerdem wird Position mit der Wahrscheinlichkeit angenommen. Da die zufälligen Entscheidungen von und (stochastisch) unabhängig sind, erhalten wirπ∈Permn i∈{1,…,n+1} Pr(L(n)=π)=1n! i 1n+1 π i
random_item
was wir zeigen mussten. Induziert beweist dies, dass Ihr Algorithmus gleichmäßig verteilte Permutationen erzeugt.
quelle