且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

利用rand7()构造rand10()

更新时间:2022-09-17 15:15:06

题意

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

参考代码

利用rand7()构造rand10()
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;
}
利用rand7()构造rand10()

解析

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

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

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

一个可行的方法

1
2
3
4
rand7()               得到随机数{1234567}
rand7()-1             得到随机数{0123456}           -------集合A
(rand7()-1)*7         得到随机数{071421283542}      -------集合B                       
(rand7()-1)*7+rand7() 得到随机数{071421283542}+{1234567}

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

 





本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3970452.html,如需转载请自行联系原作者