计算最好的方式,如果有1/4的机会东西C ++会怎样呢?
-
11-07-2019 - |
题
我不知道是否有是要找出一个聪明的办法
有一个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()
返回0
和RAND_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语句的四倍多。
幽默>