码迷,mamicode.com
首页 > 其他好文 > 详细

利用rand7()构造rand10()

时间:2014-09-14 00:00:36      阅读:389      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   ar   strong   div   sp   代码   

题意

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

参考代码

int rand7()
{
    srand((int)time(NULL)); //参考
    return rand()%7 + 1;
}
int rand10()
{
    int x;
    do 
    {
        x = (rand7()-1) * 7 + rand7();
    }while(x > 40);
    return x % 10 + 1;
}

解析

要保证rand10()均匀生成1~10的随机数,可以构造一个0~10n的随机数区间,这样通过rand10n()%10+1就是所求。

现在目标转移到生成rand10n()。如果不能生成正好rand10n(),可以通过生成rand10n+m()通过舍弃多余的m来获得rand10n()。

现在目标转移到生成rand10n+m()。

一个可行的方法

rand7()               得到随机数{1,2,3,4,5,6,7}
rand7()-1             得到随机数{0,1,2,3,4,5,6}           -------集合A
(rand7()-1)*7         得到随机数{0,7,14,21,28,35,42}      -------集合B                        
(rand7()-1)*7+rand7() 得到随机数{0,7,14,21,28,35,42}+{1,2,3,4,5,6,7}

由于A和B中元素可以看成是独立事件,根据独立事件的概率公式P(AB)=P(A)P(B),得到每个组合的概率是1/7*1/7=1/49,生成概率集合为1~49。

 

利用rand7()构造rand10()

标签:style   blog   http   color   ar   strong   div   sp   代码   

原文地址:http://www.cnblogs.com/kaituorensheng/p/3970452.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!