Ich weiß, dass diese Frage bereits beantwortet wurde, aber sie scheint gut zu funktionieren, aber ich kann Ihnen nicht sagen, ob es eine Verzerrung gibt. Meine "Tests" legen nahe, dass es zumindest vernünftig ist.
Vielleicht wäre Adam Rosenfield so freundlich, sich dazu zu äußern?
Meine (naive?) Idee ist folgende:
Akkumulieren Sie rand5, bis genügend Zufallsbits vorhanden sind, um einen rand7 zu bilden. Dazu braucht man höchstens 2 rand5. Um die Zahl rand7 zu erhalten, verwende ich den akkumulierten Wert mod 7.
Um zu vermeiden, dass der Akkumulator überläuft, und da der Akkumulator mod 7 ist, nehme ich den mod 7 des Akkumulators:
(5a + rand5) % 7 = (k*7 + (5a%7) + rand5) % 7 = ( (5a%7) + rand5) % 7
Es folgt die Funktion rand7():
(Ich habe den Bereich von rand5 auf 0-4 gesetzt und rand7 ist ebenfalls 0-6).
int rand7(){
static int a=0;
static int e=0;
int r;
a = a * 5 + rand5();
e = e + 5; // added 5/7ths of a rand7 number
if ( e<7 ){
a = a * 5 + rand5();
e = e + 5; // another 5/7ths
}
r = a % 7;
e = e - 7; // removed a rand7 number
a = a % 7;
return r;
}
Edit: Ergebnisse für 100 Millionen Versuche hinzugefügt.
Real'-Randfunktionen mod 5 oder 7
rand5 : avg=1.999802 0:20003944 1:19999889 2:20003690 3:19996938 4:19995539 rand7 : avg=3.000111 0:14282851 1:14282879 2:14284554 3:14288546 4:14292388 5:14288736 6:14280046
Mein Rand7
Der Durchschnitt sieht gut aus, und auch die Zahlenverteilungen sehen gut aus.
randt : avg=3.000080 0:14288793 1:14280135 2:14287848 3:14285277 4:14286341 5:14278663 6:14292943