已知rand7(),求rand10().

 

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

根据排列组合,连续算两次rand7出现的组合数是7*7=49,这49种组合每一种出现考虑是相同的。
怎么从49平均概率的转换为1到10呢?
方法是:
1.rand7执行两次,出来的数为a1.a2.
2.如果a1*7+a2<40,b=(a1*7+a2)>=40,重复第一步)

int rand10()
{
    int a71, a72, a10;
    
    do 
    {
        a71 = rand7() - 1;
        a72 = rand7() - 1;
        a10 = a71 *7 + a72;
    } while (a10 >= 40);
    
    return (a10) / 4 + 1;
} 

分析:

a10 = a71 *7 + a72; 会产生0~48共49个数,每个数产生的概率都是1/49.

生成的数只要<40,那么就跳出循环,那么共有40个数(0~39),每个数的概率相等,那么可以认为每个数的概率为1/40;

最后(a10) / 4 ;也就是把每这40个数切割成10等分,最后产生0~9, 10个数,每个数的概率都是1/10, 再加上1,产生的数为1~10,即rand10().

而且我们可以得到一般规律根据 RndM 得到 RndN
如果 M > N,那最简单,只要剔除 M > N 的数据,返回就可以了。
如果 M < N,首先用延展方法将 M 延展到 xM,xM > N然后再用上面的办法获取。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值