等概率产生器

题目:已知随机函数old_rand(),以p的概率产生0,以1-p的概率产生1,现在要求设计一个新的随机函数new_rand(),使其以等概率生成1和0。

分析:old_rand()没两次产生随机数(0或1)是相互独立的。那么产生两个并列的数字“01”或“10”的概率都是p(p-1),假如产生数列“01”则new_rand返回0,假如产生数列“10”则new_rand返回1,这样就实现了以同样的概率(p(p-1))产生0或1。

下面代码可供参考:

int old_rand()

{

       return rand()%2;

}

int new_rand()

{

      int first_bit = old_rand();

      int second_bit = old_rand();

      if (first_bit == 1 && second_bit == 0)

            return 1;

      else if (first_bit == 0 && second_bit == 1)

                  return 0;

            else

                  return new_rand();

}

 

 

 

以上题目可以扩展:如果要生成N个独立事件,按照上面思路,可以找N中不同的0、1序列,使每个不同的0、1序列产生的概率相等,都为(p^x)*((1-p)^y),其中x是序列中0的个数,y是序列中1的个数,每个不同序列中0的个数都一样,1的个数也都相等。

或者可以这样实现,在new_rand()产生等概率0和1的基础上,需找一个最小的k,使得2^k>=N,这样产生一个k位的等概率数,在产生的数大于N的时候丢弃,直到小于等于N为止。(这是一种:组合、放弃的思路。将每一位产生的随机数组合起来,然后将随机产生的组合后的数大于等于N的舍弃掉,只剩下小于N的数,小于N的数产生的概率是相等的)。

下面代码可以参考:

int multi_bit_rand(const int range)

{

       int temp = range;

       int data_temp = 0;

       short bit = 0;

       while(temp)

       {

              bit++;      //bit用来存储最少几个2进制位可以存下range

              temp /= 2;

       }

       while(bit--)

              data_temp = data_temp*2 + new_rand();  //每一位都是随机产生的

       if (data_temp >= range)

              return multi_bit_rand(range);     //假如不是想要的结果,递归调用

       return data_temp;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值