Redian新闻
>
一个经典的随机数的问题。求教。
avatar
一个经典的随机数的问题。求教。# JobHunting - 待字闺中
H*7
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);
avatar
t*n
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

avatar
H*7
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

avatar
t*n
4
嗯范围可以解决,
但是理论上可以证明,rand5()是没有能力只通过一次随机数的产生,和一些四则运算
,来获得更大范围的随机数的。
(前提是,这里说的都是整数哦。。。如果是实数范围的话另当别论啦。)
所以必须通过多次rand5()才行呢

范围没事,可以用 rejection sampling解决。

【在 H******7 的大作中提到】
: 范围没事,可以用 rejection sampling解决。
avatar
D*y
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
avatar
z*c
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

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。