首页 > 代码库 > 利用rand7()构造rand10()

利用rand7()构造rand10()

题意

已知有个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()