`
samuschen
  • 浏览: 399107 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

已知rand7(),求rand10().

 
阅读更多
已知rand7(),求rand10().
已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。
view plain

    根据排列组合,连续算两次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然后再用上面的办法获取。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics