用随机数生成随机数

题目要求:

有一个函数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;
}

  

原文地址:https://www.cnblogs.com/handt/p/2706028.html