我想知道是否有一种聪明的方法可以找到
有1/4的机会发生。
我知道我们可以用rand()%4执行此操作并检查它是否等于0,但有没有使用rand()的方法?在c ++中,谢谢。
答案 0 :(得分:11)
如果你的意思是想要避免许多rand()
实现的固有困惑,你应该研究the Boost Random library,它有几个高质量的pRNG(伪随机数生成器),还有很多控制输出的方法。此库在std::tr1
中也以略微修改的形式出现。
答案 1 :(得分:9)
从不 永远使用%将PRNG值截断为范围。大多数PRNG具有相对非随机的低阶位。
对于您的情况,请使用像BCS建议的部门(RAND_MAX / n)。
答案 2 :(得分:4)
答案 3 :(得分:4)
rand() < RAND_MAX/n;
如果你不喜欢C的标准rand(),那么选择一个比C更好的rand()。
答案 4 :(得分:3)
你可以写自己的兰特。 (不要这样做) 你可以抓住tickcount。 (不要经常这样做) 你可以算一下,每四次调用都会返回true。
你应该只调用rand()。
答案 5 :(得分:3)
我不太了解C ++,所以我可能错了。但似乎rand()
返回0
和RAND_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;