计算C ++中是否会出现1/4的可能性的最佳方法是什么?

时间:2008-11-28 22:20:49

标签: c++ probability random

我想知道是否有一种聪明的方法可以找到

有1/4的机会发生。

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

11 个答案:

答案 0 :(得分:11)

如果你的意思是想要避免许多rand()实现的固有困惑,你应该研究the Boost Random library,它有几个高质量的pRNG(伪随机数生成器),还有很多控制输出的方法。此库在std::tr1中也以略微修改的形式出现。

答案 1 :(得分:9)

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

对于您的情况,请使用像BCS建议的部门(RAND_MAX / n)。

答案 2 :(得分:4)

random number generator

答案 3 :(得分:4)

rand() < RAND_MAX/n;
如果你不喜欢C的标准rand(),那么选择一个比C更好的rand()。

答案 4 :(得分:3)

你可以写自己的兰特。 (不要这样做) 你可以抓住tickcount。 (不要经常这样做) 你可以算一下,每四次调用都会返回true。

你应该只调用rand()。

答案 5 :(得分:3)

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

double odds = .25;

if(rand() <= RAND_MAX * odds) {
    // there should be .25 chance of entering this condition
}
PS:也许这需要一些演员。

答案 6 :(得分:1)

为什么不使用rand()?如果您担心“真实”随机性与伪随机性,您可以尝试using physical sources of random bits。更复杂,通常是不必要的。

答案 7 :(得分:1)

您可以使用其他类型的RNG,例如具有更好整体熵的Mersenne twister。关于Multuply with Carry RNG,我也听到了很多好消息。

答案 8 :(得分:1)

4是一个特例。您可以假设您的PRNG有50%的机会输出偶数,我认为 - 对于libc的LCG(rand)。因此,输出偶数两次的概率为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库。然后,只需look at the code of uniform_int并重现行为。人才模仿,天才偷。 ;)

答案 9 :(得分:0)

嗯......写下自己的rand()?你需要一些种随机函数!

答案 10 :(得分:0)

尝试:

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

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

&LT; /幽默&GT;