Angenommen, wir haben einen Zufallsgenerator, der Zahlen im Bereich mit gleichmäßiger Verteilung ausgibt, und wir müssen Zufallszahlen im Bereich mit gleichmäßiger Verteilung generieren .
Angenommen, und teilen nicht gleichmäßig ; Um eine wirklich gleichmäßige Verteilung zu erhalten , können wir die Methode der Rückweisungsabtastung verwenden:
- wenn die größte ganze Zahl ist, so dass
- wähle eine Zufallszahl in
- wenn ist, wird r ausgegeben , versuchen Sie es ansonsten mit anderen Zufallszahlen r ', r ", ..., bis die Bedingung erfüllt ist
Ist die Ablehnungsabtastung der einzige Weg, um eine wirklich gleichmäßige diskrete Verteilung zu erhalten?
Wenn die Antwort ja ist, warum?
Hinweis: Wenn die Idee dieselbe: eine Zufallszahl in , zum Beispiel wobei eine Zufallszahl im Bereichr ' [ 0 .. R m - 1 ] , R m > = N r ' = R ( . . . R ( R r 1 + r 2 ) . . . ) + R m r i [ 0 .. R - 1 ]
Antworten:
Ja und nein, je nachdem, was Sie mit "der einzige Weg" meinen. Ja, da es keine Methode gibt, deren Beendigung garantiert ist, ist das Beste, was Sie tun können (für generische Werte von und R ), ein Algorithmus, der mit Wahrscheinlichkeit 1 endet. Nein, Sie können die "Verschwendung" so klein wie möglich machen wie es Dir gefällt.N R
Warum eine garantierte Kündigung generell unmöglich ist
Nehmen wir an, dass Sie eine deterministische Berechnung Engine haben (eine Turing - Maschine oder was auch immer Ihr Boot schwimmt) sowie ein Orakel , das zufällige Elemente des erzeugt -elementigen Satz [ 0 .. R - 1 ] . Ihr Ziel ist es, ein Element der N- Elementmenge [ 0 , N - 1 ] zu erzeugen . Die Leistung Ihres Motors hängt nur von der Reihenfolge der vom Orakel zurückgegebenen Werte ab. es ist eine Funktion f dieser potentiell unendlichen Folge ( r 0 , r 1 , r 2 , … )R [0..R−1] N [0,N−1] f (r0,r1,r2,…) .
Angenommen, Ihr Motor ruft das Orakel höchstens Mal an. Es kann Spuren geben, für die das Orakel weniger als m- mal aufgerufen wird. Wenn dies der Fall ist, wird die Ausgabe nicht geändert, wenn das Orakel zusätzliche Male aufgerufen wird, sodass es immer genau m Mal aufgerufen wird . Ohne Verlust der Allgemeinheit nehmen wir also an, dass das Orakel genau m- mal genannt wird. Dann ist die Wahrscheinlichkeit des Ergebnisses x die Anzahl der Folgen ( r 0 , … , r m - 1 ), so dass f ( r 0 , … , r m -m m m m x (r0,…,rm−1) . Da das Orakel ein einheitlicher Zufallsgenerator ist, ist jede Sequenz gleich wahrscheinlich und hat die Wahrscheinlichkeit1 / R m . Daher hat die Wahrscheinlichkeit jedes Ergebnisses die FormA / R m, wobeiAeine ganze Zahl zwischen0und R m ist .f(r0,…,rm−1)=x 1/Rm A/Rm A 0 Rm
Wenn R m für einige m dividiert , können Sie eine gleichmäßige Verteilung über N Elemente erzeugen, indem Sie den Zufallsgenerator m- mal aufrufen (dies wird dem Leser als Übung überlassen). Andernfalls ist dies unmöglich: Es gibt keine Möglichkeit, ein Ergebnis mit der Wahrscheinlichkeit 1 / N zu erhalten . Beachten Sie, dass die Bedingung gleichbedeutend ist mit der Aussage, dass alle Primfaktoren von N auch Faktoren von R sind (dies ist toleranter als das, was Sie in Ihrer Frage geschrieben haben). Sie können beispielsweise ein zufälliges Element aus 4 mit einer 6-seitigen Fair auswählen sterben, obwohl 4 6) nicht teilt.N Rm m N m 1/N N R
Abfall reduzieren
In Ihrer Strategie, wenn , Sie müssen nicht sofort neu zeichnen. Intuitiv ist in [ k noch ein wenig Entropie übrigr≥kN das Sie im Mix behalten können.[kN..R−1]
Nehmen Sie für einen Moment an, dass Sie tatsächlich für immer Zufallszahlen unter generieren und Sie generieren jeweils u davon, indem Sie d- Draws machen. Wenn Sie für diese gruppierte Generation eine einfache Stichprobe zur Zurückweisung durchführen, beträgt der Abfall über d draws R d - kN u d d , dh der RestRdmodNudividiert durch die Anzahl der Ziehungen. Dies kann nurgcd(R,N) sein. WennRundNKoprime sind, können Sie die Verschwendung beliebig klein machen, indem Sie ausreichend große Werte fürd auswählen. Für allgemeine Werte vonRundNist die Berechnung komplizierter, da Sie die Erzeugung vongcd(R,N)undN/gcd(R)berücksichtigen müssenRd−kNud RdmodNu gcd(R,N) R N d R N gcd(R,N) getrennt, aber auch hier kann man den Abfall mit ausreichend großen Gruppen beliebig klein machen.N/gcd(R,N)
In der Praxis lohnt es sich auch bei relativ ineffizienten Zufallszahlen (z. B. in der Kryptographie) selten, etwas anderes als eine einfache Zurückweisungsabtastung durchzuführen, es sei denn, ist klein. Beispielsweise schreitet in der Kryptographie, wo R typischerweise eine Potenz von 2 und N typischerweise Hunderte oder Tausende von Bits ist, die Erzeugung einheitlicher Zufallszahlen gewöhnlich durch direktes Zurückweisungsabtasten in dem gewünschten Bereich voran.N R N
quelle
Shannons Quellcodierungssatz zeigt, dass Sie Stichproben (im Durchschnitt) vom Typ [ 0 , … , R - 1 ] benötigen , um eine Zufallszahl vom Typ [ 0 , … , N ] zu generieren - 1 ] . Genauer gesagt gibt Shannon einen (ineffizienten) Algorithmus an, der bei m Abtastwerten des ersten Typs m ausgibt ( log N / log R - ϵ ).logN/logR [0,…,R−1] [0,…,N−1] m m(logN/logR−ϵ) Proben des zweiten Typs mit hoher Wahrscheinlichkeit. Er zeigt auch, dass die Ausgabe von Abtastwerten mit hoher Wahrscheinlichkeit unmöglich ist.m(logN/logR+ϵ)
Der Satz von Shannon funktioniert auch im allgemeineren Fall einer verzerrten Eingabeverteilung (und wahrscheinlich auch einer verzerrten Ausgabeverteilung). In diesem Fall müssen Sie den Logarithmus durch die Entropie ersetzen. Während der vom Theorem gegebene Algorithmus zufällig definiert wird, ist es in einigen Fällen möglich, ihn zu derandomisieren (auf Kosten einer etwas schlechteren Leistung).
quelle
Nein, die Probenahme bei Ablehnung ist keineswegs die einzige Vorgehensweise. Bedauerlicherweise ist, wenn man bedenkt, dass Computer alle Informationen als Bits speichern und daher nur zufällige Informationsbits manipulieren können, jeder Algorithmus zum Zeichnen einer einheitlichen Zufallsvariablen des Bereichs unendlich, wenn die binäre Basisentwicklung von N unendlich ist.N N
Dieses Theorem ist ein klassisches Ergebnis von Knuth und Yao (1976), die das Gerüst von DDG-Bäumen (diskrete Verteilung erzeugende Bäume) entwickelt haben.
Die von Gilles offen gelegten Methoden sind die typische Vorgehensweise, um den Abfall zu verringern, der durch die Ablehnung entsteht. Wenn man jedoch folgende Knuth- und Yao-Bäume erzeugen kann, ist dies viel, viel effizienter - im Durchschnitt 96% der zufälligen Bits werden gerettet.
Weitere Informationen dazu habe ich im folgenden CStheory-Beitrag gegeben .
quelle