y****n 发帖数: 60 | 1 给的答案是:
int num = 5*(rand5()-1) + (rand5()-1);
if(num<21) return ( num%7+1);
不明白为什么第一行代码要两个相加?前面一个不就是0 到20 的uniform
distribution 了吗?两个random number 加之后并不是uniform 的distribution 啊?
谢谢。 | N*****m 发帖数: 42603 | 2 0-24的uniform
【在 y****n 的大作中提到】 : 给的答案是: : int num = 5*(rand5()-1) + (rand5()-1); : if(num<21) return ( num%7+1); : 不明白为什么第一行代码要两个相加?前面一个不就是0 到20 的uniform : distribution 了吗?两个random number 加之后并不是uniform 的distribution 啊? : 谢谢。
| f*******3 发帖数: 577 | 3 int num = 5*(rand5()-1) 不是0 到20 的uniform 是0 5 10 15 20 只有5个数字,不
够7来mod
【在 y****n 的大作中提到】 : 给的答案是: : int num = 5*(rand5()-1) + (rand5()-1); : if(num<21) return ( num%7+1); : 不明白为什么第一行代码要两个相加?前面一个不就是0 到20 的uniform : distribution 了吗?两个random number 加之后并不是uniform 的distribution 啊? : 谢谢。
| A**u 发帖数: 2458 | 4 5*(rand5()-1) + (rand5()-1)
可以这么理解,
从0,1,2,4,取两个随机数A,B
组成AB, 以5为base. 则数值为 A * 5 + B.
所以 00,01,02,03,04, 10,11,12,13,14.....,40,41,42,43,44 都是1/(25)概率
对应于0,1, 2, 3, 4, 5, 6, 7, 8, 9........ 20,21,22,23,24都是1/25概率
发生.
取余只不过是为了增加效率 |
|