用随机数生成随机数
题目要求:
有一个函数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; }