我不知道是否有是要找出一个聪明的办法

有一个1/4机会有事。

我知道我们可以兰特做到这一点()%4,并检查它是否等于0,但有没有使用兰特的方式()?在C ++中,由于

没有正确的解决方案

其他提示

如果你的意思是你想避免许多rand()实现的内在crappiness,你应该考虑的升压随机文库,其中有几个高品质的PRNG(伪随机数生成器),以及许多方法来控制输出。该库也存在于在std::tr1略微修饰形式。

<强>从不使用%,持续截断PRNG值转换成范围。大多数的PRNG具有相对非随机的低阶位。

有关的情况下,使用一个除法(RAND_MAX / N)等BCS暗示。

“随机数发生器”

rand() < RAND_MAX/n;

挑选比C的更好的RAND(),如果你不喜欢C'S标准兰特()。

您可以编写自己的兰特。 (不这样做)。点击 你可以抢计时单位计数。 (不这样做太频繁)。结果 你可以只算,每第四调用返回true。

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

我不知道很多C ++,所以我可能是错的。但似乎rand()返回0RAND_MAX-1之间的值。因此,也许你可以做这样的事情:

double odds = .25;

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

PS:也许这需要一些铸造

为什么不使用RAND()?如果您担心“真”随机性与伪随机性,你可以尝试的使用物理源的随机比特的。要复杂得多,而且通常是不必要的。

您可以使用另一种类型的RNG的如梅森捻线其具有更好的整体熵。我还听说 Multuply好东西带进的RNG。

图4是一种特殊情况。你可以假设你的PRNG得到了输出偶数,这是案件的50分%的机会 - 我认为 - 对libc中的LCG(兰特)。两次输出偶数的概率是因此25%。

...因此

bool rand_afourth(void)
{
    return !!((rand() & 1) & (rand() & 1));
}

和现在的学究...

您想要做的是有一个统一的随机生成的,但限制在一定的范围内,在这种情况下为4的熵如果你的PRNG有,比方说,32位的熵,你不能肯定,计算所述输出模4将正常工作。这需要更多的工作。

幸运的是,这项工作已在Boost库实现的。

boost::uniform_int<> aFourth(1,4)

和你会例如说 “OK” 每次您得到1(或2,3,4,如你喜欢)。

但你可能不希望使用升压库。然后,只需看uniform_int 的代码和重现行为。人才模仿,偷的天才。 ;)

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

尝试:

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

然后,你会发现它给你出事了完善的25%的概率(假设你执行if语句的四倍多。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top