一个有意思的思考题

题目是这样的:一个随机数生成器可以等概率生成1到5的整数,每次生成一个数,要求用它等概率生成1到7整数

 

这里可以推理出由1到5的空间到1到7的空间,线性关系肯定不行,可以想到用生成器生成2、3...次组合起来.等概率地生成1到7。

综合和同学讨论的结果,有以下两种方式是可以的:

一、使用两次生成器,两次的结果组合成一个整数分别为十位数和个位数,如下排列:

11  21  31  41  51

12  22  32  42  52

13  23  33  43  53

14  24  34  44  54

15  25  35  45  55

共有5*5个数,这25个数是等概率生成的,有如下两个关系,

  关系一:

         11、32、53、25 mod 7 余 4;

         21、42、14、35 mod 7 余 0;

         31、52、24、45 mod 7 余 3;

         41、13、34、55 mod 7 余 6;

         51、23、44        mod 7 余 2;

         12、33、54        mod 7 余 5;

         22、43、15        mod 7 余 1;

这里25个数可以包容3个7,多出四个数,当组合出的数是{25,35,45,55}中的数时,则假设这种情况失败,重新生成,其它数可以等概率生成0-6,然后加上1即可等概率地得到1-7。

  关系二:

         用数组int[5*5]来存放这25个数,数11到55对应数组下标0-24;

每个组合数出来后,其在数组中对应下标(下标为21、22、23、24除外,处理情况同上)mod 7后也等概率得到0-6,加1后即得到1-7。

 

二、使用8次生成器,将结果相加,得8-40共33个数,它们等概率生成。(个人推荐这种方法,我同学几分钟就想出来)

将这些数mod 8后可得:

         5个0;

         4个1;

         4个2;

         4个3;

         4个4;

         4个5;

         4个6;

         4个7;

共33个数,当得到0时假设这种情况失败,重新生成,则可等概率得到1-7。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值