题意
已知有个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()。
一个可行的方法
1
2
3
4
|
rand
7
() 得到随机数{
1
,
2
,
3
,
4
,
5
,
6
,
7
}
rand
7
()
-1
得到随机数{
0
,
1
,
2
,
3
,
4
,
5
,
6
} -------集合A
(rand
7
()
-1
)*
7
得到随机数{
0
,
7
,
14
,
21
,
28
,
35
,
42
} -------集合B
(rand
7
()
-1
)*
7
+rand
7
() 得到随机数{
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。
本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3970452.html,如需转载请自行联系原作者