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.NR
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 -mmmmx(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)=x1/RmA/RmA0Rm
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.NRmmNm1/NNR
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 - kNudd , 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−kNudRdmodNugcd(R,N)RNdRNgcd(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.NRN