Assuming that:
int fairCoinToss();
1 2 , :
int biasedCoinToss(int n);
(1) 1/n , :
int biasedCoinToss(int n) {
if (n == 1) {
return 1;
} else if (n == 2) {
return fairCoinToss();
}
int r = random_number(n);
return r == 0 ? 1 : 0;
}
random_number(n) , 0 <= i < n. , random_number(3) 0, 1 2. , 0 1/3 .
, , . fairCoinToss() 1 0. . :
fairCoinToss() << 1 | fairCoinToss()
:
00 = 0
01 = 1
10 = 2
11 = 3
0 3 (n = 4).
, n -2, . , . , n = 5. 0 7. "" 5, 6 7, 0 4, () , 0 4 , .
:
int random_number(int n) {
int ret;
do {
int limit = 2;
ret = fairCoinToss();
while (limit < n) {
ret <<= 1;
ret |= fairCoinToss();
limit <<= 1;
}
} while (ret >= n);
return ret;
}