2

我想知道是否有一个聪明的方法来找出

有 1/4 的机会发生某事。

我知道我们可以使用 rand() % 4 来执行此操作并检查它是否等于 0,但是有没有不使用 rand() 的方法?在 c++ 中,谢谢。

4

11 回答 11

11

如果您的意思是要避免许多rand()实现的固有缺陷,您可能应该查看Boost Random 库,它有几个高质量的 pRNG(伪随机数生成器)和许多控制输出的方法。该库在std::tr1.

于 2008-11-28T22:32:05.240 回答
9

永远不要 使用% 将 PRNG 值截断到一个范围内。大多数 PRNG 具有相对非随机的低阶位。

对于您的情况,请使用 BCS 建议的除法 (RAND_MAX / n)。

于 2008-11-28T22:52:33.637 回答
5

随机数发生器

于 2008-11-28T22:23:47.113 回答
4
rand() < RAND_MAX/n;

如果您不喜欢 C 的标准 rand(),请选择比 C 更好的 rand()。

于 2008-11-28T22:50:39.743 回答
3

我不太了解C++,所以我可能错了。但它似乎rand()返回 和 之间的0RAND_MAX-1。所以也许你可以做这样的事情:

double odds = .25;

if(rand() <= RAND_MAX * odds) {
    // there should be .25 chance of entering this condition
}

PS:也许这需要一些演员。

于 2008-11-29T00:16:04.640 回答
3

你可以写你自己的兰特。(不要这样做)。
你可以抓住滴答数。(不要经常这样做)。
你可以数一数,每四个调用就返回 true。

您可能应该只调用 rand()。

于 2008-11-28T22:24:11.310 回答
1

为什么不使用 rand()?如果您担心“真实”随机性与伪随机性,可以尝试使用随机位的物理源。更复杂,通常是不必要的。

于 2008-11-28T22:31:59.187 回答
1

您可以使用另一种类型的 RNG,例如具有更好整体熵的Mersenne twister 。我还听说了有关带有 Carry RNG 的乘法运算的好消息。

于 2008-11-28T23:11:26.440 回答
1

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 的代码并重现该行为。天才模仿,天才偷窃。;)

于 2008-11-29T10:14:32.763 回答
0

尝试:

static int r = 0;
: : :
if ((r = (r+1)%4) == 0) {
    // do something.
}

然后你会发现它给了你一个完美的 25% 的概率发生某事(假设你执行 if 语句四次的倍数。

</幽默>

于 2008-11-28T23:29:03.767 回答
0

嗯...自己写rand()?您将需要某种随机函数!

于 2008-11-28T22:24:11.683 回答