面试:关于rand7()构造rand10()的问题

已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10


这类问题的解决思路无外乎是将rand7求两遍,利用某种方法巧妙的构造出连续的一组数。上题的解决思路如下:
1.rand7执行两次,出来的数为a1=rand7()-1,a2=rand7()-1.
2.如果a1*7+a2<40,b=(a1*7+a2)/4+1;如果a1*7+a2>=40,重复第一步。


简单的加减不能使用是因为加法每个结果出现的概率不同,例如:加法得到7的概率明显高于加法得到14或者2的概率,而乘法得到的结果又不够连续,不易得出1~10。
于是我们选择了a1*k+a2的思路,对于k的取值问题
1、k<7:出现同加法同样的问题,就是每个结果出现的概率不同
2、k>7:结果不连续
3、k=7:每个结果出现的概率都是1/49,且结果连续,合适。下面计算每个结果出现的概率:


对于0~48出现的概率为1/49,这个很容易,因此,做a1*7+a2后出现的概率为:
4/49+(9/49)*4/49+(9/49)*(9/49)*(4/49)+......=4/49*(1/(1-9/49))=1/10
因此以上方法可以实现rand7()构造rand10()。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值