我有点混淆了运算符和随机生成。我想我只是在问,这段代码是否做了我想要的事情?
根据我分配给函数的概率,生成一个‘随机’的TRUE或FALSE。
bool randtf(int probability) {
if ((rand() % 100) < probability)
return true;
else
return false;
}所以如果是randtf(63),它有63%的机会是TRUE
任何指导都将不胜感激。谢谢。
发布于 2011-10-27 07:50:49
是的,一次近似值。
不,更准确地说。rand()返回一个介于0和RAND_MAX之间的数字,实际上,该数字的形式始终为(1 << n) - 1。这不是100的倍数,所以当你取模数时,你不会得到完全均匀的分布。
您可以通过使用拒绝采样来解决此问题。为了便于讨论,我们假设RAND_MAX == 32767 (即16位)。第一步是继续生成随机数,拒绝它们,直到得到一个小于32700的数( 100的最大倍数小于RAND_MAX)。如果你对它做模数运算,你会得到一个均匀的分布。
当然,这假设了一个合理的、统计上健壮的rand()实现,这是一个相当大的假设!
发布于 2011-10-27 07:54:45
MAX_RAND不是100的倍数,所以从技术上讲,你的发行版是不公平的。您必须缩放rand(),而不是修改它。
发布于 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。
https://stackoverflow.com/questions/7910273
复制相似问题