我想知道是否有一个聪明的方法来找出
有 1/4 的机会发生某事。
我知道我们可以使用 rand() % 4 来执行此操作并检查它是否等于 0,但是有没有不使用 rand() 的方法?在 c++ 中,谢谢。
我想知道是否有一个聪明的方法来找出
有 1/4 的机会发生某事。
我知道我们可以使用 rand() % 4 来执行此操作并检查它是否等于 0,但是有没有不使用 rand() 的方法?在 c++ 中,谢谢。
如果您的意思是要避免许多rand()
实现的固有缺陷,您可能应该查看Boost Random 库,它有几个高质量的 pRNG(伪随机数生成器)和许多控制输出的方法。该库在std::tr1
.
永远不要 使用% 将 PRNG 值截断到一个范围内。大多数 PRNG 具有相对非随机的低阶位。
对于您的情况,请使用 BCS 建议的除法 (RAND_MAX / n)。
rand() < RAND_MAX/n;
如果您不喜欢 C 的标准 rand(),请选择比 C 更好的 rand()。
我不太了解C++,所以我可能错了。但它似乎rand()
返回 和 之间的0
值RAND_MAX-1
。所以也许你可以做这样的事情:
double odds = .25;
if(rand() <= RAND_MAX * odds) {
// there should be .25 chance of entering this condition
}
PS:也许这需要一些演员。
你可以写你自己的兰特。(不要这样做)。
你可以抓住滴答数。(不要经常这样做)。
你可以数一数,每四个调用就返回 true。
您可能应该只调用 rand()。
为什么不使用 rand()?如果您担心“真实”随机性与伪随机性,可以尝试使用随机位的物理源。更复杂,通常是不必要的。
您可以使用另一种类型的 RNG,例如具有更好整体熵的Mersenne twister 。我还听说了有关带有 Carry RNG 的乘法运算的好消息。
4是特例。你可以假设你的 PRNG 有 50% 的机会输出一个偶数,我认为这就是 libc (rand) 的 LCG 的情况。因此,两次输出偶数的概率为 25%。
所以...
bool rand_afourth(void)
{
return !!((rand() & 1) & (rand() & 1));
}
现在对于学究...
你想要做的是生成一个统一的随机数,但限制在一定范围内,在这种情况下熵为 4。如果你的 PRNG 有一个 32 位的熵,你不能确定计算输出mod 4 将按预期工作。这需要更多的工作。
幸运的是,这项工作已经在 boost 库中实现了。
boost::uniform_int<> aFourth(1,4)
例如,每次获得 1(或 2、3、4,如您所愿)时,您都会说“ok”。
但是您可能不想使用 boost 库。然后,只需查看 uniform_int 的代码并重现该行为。天才模仿,天才偷窃。;)
尝试:
static int r = 0;
: : :
if ((r = (r+1)%4) == 0) {
// do something.
}
然后你会发现它给了你一个完美的 25% 的概率发生某事(假设你执行 if 语句四次的倍数。
</幽默>
嗯...自己写rand()
?您将需要某种随机函数!