1、给一个函数,返回0和1,概率为p和1-p,请你实现一个函数,使得返回0、1的概率一样
分析:这是典型的随机概率发生器的案例,我们先用数学知识来分析一下,函数返回0出现的概率为p,返回1出现的概率为1-p,如果单独返回1位0或1位1,那么没有办法实现返回0和1的概率一样。所以我们需要更大的位数来分析,因为存在返回0和1两种情况,我们把位数定为2,那么组合出来的信息就有2*2=4种:
00 —>概率为p*p
01 —>概率为p*(1-p)
10 —>概率为(1-p)*p
11 —>概率为(1-p)*(1-p)
四种情况中我们发现 01和10的两种组合返回的概率都是p*(1-p),那么我们可以认为这两种情况下返回0和返回1的概率是相等的。接下来就是要想办法使得00和11两种组合返回的概率相等。在Java中我们可以使用Random函数来产生随机数,再使用组合的方法保证概率一样
代码如下:
import java.util.Random;
public class RandomEquals {
public static int random() {
Random random = new Random(25);
int i,j;
i = random.nextInt();
j = random.nextInt();
int result;
while(true) {
if(i==0 && j==1) {
result = 0;
break;
}else if(i==1 && j==0) {
result = 1;
break;
}else {
continue;
}
}
return result;
}
}
扩展一下:
已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,
使得它构造0和1的概率均为1/2;构造一个发生器,使得它构造1、2、3的概率均为1/3;…,
构造一个发生器,使得它构造1、2、3、…n的概率均为1/n,要求复杂度最低。
解答:
对n=2,认为01表示0、10表示1,等概率,其他情况放弃
对n=3,认为001表示1、010表示2,100表示3,等概率,其他情况放弃
对n=4,认为0001表示1、0010表示2,0100表示3,1000表示4,等概率,其他情况放弃
思想都是一样的