H******7 发帖数: 1728 | 1 在别的论坛看到别人再问。觉得不太明白。
Expand a random range from 1-5 to 1-7
int i;
do
{
i = 5 * (rand5() - 1) + rand5(); // i is now uniformly random between 1
and 25
} while(i > 21);
// i is now uniformly random between 1 and 21
return i % 7 + 1; // result is now uniformly random between 1 and 7
WHy can't I just put
i = 6*(rand5()-1); |
t**********n 发帖数: 145 | 2 1没有保证平均概率
2返回的数值的范围也不对呀
在别的论坛看到别人再问。觉得不太明白。
Expand a random range from 1-5 to 1-7
int i;
do
{
i = 5 * (rand5() - 1) + rand5(); // i is now uniformly random between 1
and 25
} while(i > 21);
// i is now uniformly random between 1 and 21
return i % 7 + 1; // result is now uniformly random between 1 and 7
WHy can't I just put
i = 6*(rand5()-1);
【在 H******7 的大作中提到】 : 在别的论坛看到别人再问。觉得不太明白。 : Expand a random range from 1-5 to 1-7 : int i; : do : { : i = 5 * (rand5() - 1) + rand5(); // i is now uniformly random between 1 : and 25 : } while(i > 21); : // i is now uniformly random between 1 and 21 : return i % 7 + 1; // result is now uniformly random between 1 and 7
|
H******7 发帖数: 1728 | 3 范围没事,可以用 rejection sampling解决。
【在 t**********n 的大作中提到】 : 1没有保证平均概率 : 2返回的数值的范围也不对呀 : : 在别的论坛看到别人再问。觉得不太明白。 : Expand a random range from 1-5 to 1-7 : int i; : do : { : i = 5 * (rand5() - 1) + rand5(); // i is now uniformly random between 1 : and 25
|
t**********n 发帖数: 145 | 4 嗯范围可以解决,
但是理论上可以证明,rand5()是没有能力只通过一次随机数的产生,和一些四则运算
,来获得更大范围的随机数的。
(前提是,这里说的都是整数哦。。。如果是实数范围的话另当别论啦。)
所以必须通过多次rand5()才行呢
范围没事,可以用 rejection sampling解决。
【在 H******7 的大作中提到】 : 范围没事,可以用 rejection sampling解决。
|
D*********y 发帖数: 876 | 5 5*(rand5()-1):产生0,5,10,15或者20
5 * (rand5() - 1) + rand5()就是1-25之间的随机数
如果我没有记错的话,后面那个while应该是:
if(i<21) return i%7
while(i > 21);
// i is now uniformly random between 1 and 21
return i % 7 + 1;
产生的是2-5,就不对了
至于楼主的做法,
i = 6*(rand5()-1),产生的是0,6,12,18或者24 |
z**c 发帖数: 625 | 6 你那个结果出来就是0,6,12,18,24
去掉24,剩下0,6,12,18
取模之后是0,6,5,3
+1之后是1,7,6,4
所以你这个最后产生的是1,4,6,7,各25%概率,根本不是1-7的uniform
【在 H******7 的大作中提到】 : 在别的论坛看到别人再问。觉得不太明白。 : Expand a random range from 1-5 to 1-7 : int i; : do : { : i = 5 * (rand5() - 1) + rand5(); // i is now uniformly random between 1 : and 25 : } while(i > 21); : // i is now uniformly random between 1 and 21 : return i % 7 + 1; // result is now uniformly random between 1 and 7
|