首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据概率判断对错

根据概率判断对错
EN

Stack Overflow用户
提问于 2011-10-27 07:48:22
回答 4查看 1.5K关注 0票数 2

我有点混淆了运算符和随机生成。我想我只是在问,这段代码是否做了我想要的事情?

根据我分配给函数的概率,生成一个‘随机’的TRUEFALSE

代码语言:javascript
复制
bool randtf(int probability) {
    if ((rand() % 100) < probability)
        return true;
    else
        return false;
}

所以如果是randtf(63),它有63%的机会是TRUE

任何指导都将不胜感激。谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-27 07:50:49

是的,一次近似值。

不,更准确地说。rand()返回一个介于0RAND_MAX之间的数字,实际上,该数字的形式始终为(1 << n) - 1。这不是100的倍数,所以当你取模数时,你不会得到完全均匀的分布。

您可以通过使用拒绝采样来解决此问题。为了便于讨论,我们假设RAND_MAX == 32767 (即16位)。第一步是继续生成随机数,拒绝它们,直到得到一个小于32700的数( 100的最大倍数小于RAND_MAX)。如果你对它做模数运算,你会得到一个均匀的分布。

当然,这假设了一个合理的、统计上健壮的rand()实现,这是一个相当大的假设!

票数 6
EN

Stack Overflow用户

发布于 2011-10-27 07:54:45

MAX_RAND不是100的倍数,所以从技术上讲,你的发行版是不公平的。您必须缩放rand(),而不是修改它。

票数 0
EN

Stack Overflow用户

发布于 2011-10-27 07:54:48

这取决于rand()返回的内容,特别是可能数字的范围是否精确到100的倍数(并且是均匀分布的)。一般来说,使用模数并不一定会给出正确的统计行为。

例如,假设您的rand()只返回值0、1、2、3、4、5、6;您说的是rand() % 5 < p (其中是0 <= p < 5)。但是请注意:这将值0和1取了两次,但是2、3和4只在有效源号范围内取了一次!因此,使用p = 4,您实际上不会获得80%的概率,而只有1/7。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7910273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档