Modulo-Bias ist ein Problem, das entsteht, wenn man naiv die Modulo-Operation verwendet, um Pseudozufallszahlen kleiner als eine gegebene "obere Grenze" zu erhalten.Eliminierung der Modulo-Bias: Wie wird es in der Funktion arc4random_uniform() erreicht?
Daher verwende ich als C-Programmierer eine modifizierte Version der arc4random_uniform()
-Funktion, um gleichmäßig verteilte Pseudozufallszahlen zu erzeugen.
Das Problem ist, ich verstehe nicht, wie die Funktion mathematisch funktioniert.
Dies ist die erläuternde Kommentar der Funktion, durch einen Link zur vollständigen Quellcode gefolgt:
/*
* Calculate a uniformly distributed random number less than upper_bound
* avoiding "modulo bias".
*
* Uniformity is achieved by generating new random numbers until the one
* returned is outside the range [0, 2**32 % upper_bound). This
* guarantees the selected random number will be inside
* [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound)
* after reduction modulo upper_bound.
*/
Aus dem Kommentar oben wir definieren:
[2^32 % upper_bound, 2^32)
- Intervall A[0, upper_bound)
- Intervall B
Um zu arbeiten, setzt die Funktion auf der Tatsache, dass Intervall A Karten B. Intervall
Meine Frage ist: mathematisch, wie die Zahlen im Intervall im Intervall Eine Karte kommt gleichmäßig auf denjenigen B? Und gibt es einen Beweis dafür?
Darf ich diese Lektüre vorschlagen: http://ericlippert.com/2013/12/16/how-much-bias-is-introduced-by-the-remainder-technique/ – ouah
"Generieren neuer Zufallszahlen bis .. . "ist eine schlechte Technik. Ich habe die Antwort nicht zur Hand, aber es ist besser, die Zufallszahl auf den erforderlichen Bereich zu skalieren, als abzuweisen und Zeit zu verschwenden. Ist das eine Verwendung? http://stackoverflow.com/questions/10984974/why-do-people-say-there-is-modulo-bias-when-using-a-random-number-generator Die ganze Idee der Zufallszahlen ist mit Schwierigkeiten behaftet, Es ist leicht, "zufällig" mit "gleichmäßig verteilt" zu verwechseln. –
"... es ist besser, die Zufallszahl auf den erforderlichen Bereich zu skalieren, ..." Das ist tatsächlich nicht möglich :-) Versuchen Sie zum Beispiel, eine ganze Zahl gleichmäßig aus der Menge {1, 2, 3, 4 , 5} mit einem einzigen Wurf eines Würfels. – m7thon