题目要求:
有一个函数fun能返回0和1两个值,返回0和1的概率都是1/2,问怎么利用这个函数得到另一个函数fun2,使fun2也只能返回0和1,返回0的概率为0.3而返回1的概率为0.7
解法思想:
0,1随机生成,可以理解成2进制
a = fun() * 2^4 + fun() * 2^3 + fun() * 2^2 + fun() * 2^1 + fun() 等概率生成0-31的所有数
去掉30和31之后,在0-29之间进行一个%3 输出
伪代码:
int generator()
{
// 生成一个 0 - 31 之间的数字
return a = fun() * 2^4 + fun() * 2^3 + fun() * 2^2 + fun() * 2^1 + fun();
}
int fun2()
{
int a = generator();
// 缩减到 0 - 29 的范围
while(a == 30 || a == 31){
a = generator();
}
// 3*1 - 3*9 共9个能被3 整除,返回0
// 剩余30 -9 = 21 个不能被整除,返回1
// 比例为9:21 = 3:7
if(a != 0){
int b = a % 3; // 3*1 - 3*9
if(b == 0){
return 0;
}
}
return 1;
}