0-1等概率问题
问题描述
- 一个随机数产生器以概率P生成0,以概率(1-P)生成1,怎样生成等概率的0和1?
主要思路
- 如果用这个产生器产生两个位,出现00的概率为P^2,出现01的概率为P(1-P),出现10的概率为P(1-P),而出现11的概率为(1-P)^2。故而可以用10表示1,01表示0,从而保证生成0和1的概率是相同的。
代码实现
int generate01(int (*func)()) {
if (func == NULL)
return -1;
int num1 = -1;
int num2 = -1;
int ret = -1;
while(num1 != num2){
num1 = func();
num2 = func();
if (num1 == 1 && num2 == 0) {
ret = 1;
break;
} else if (num1 == 0 && num2 == 1) {
ret = 0;
break;
}
}
return ret;
}
0-1问题扩展
- 利用这个随机数生成器,等概率的生成1,2,……,n
主要思路
- 利用上面实现的等概率生成0-1的生成器,等概率的生成k为二进制的bit,而其表示的整数值X在0~n-1的范围时,输出X+1,否则重复产生。
代码实现