int random(){
double x = ((double) rand()/(RAND_MAX)); // this i tried but only 0
return x;
}
我如何生成0或随机播放生成0或1,而不是在
int random(){
double x = ((double) rand()/(RAND_MAX)); // this i tried but only 0
return x;
}
我如何生成0或随机播放生成0或1,而不是在
如果你有C++11
你可以使用新的标准<random>
库。特别是std::bernoulli_distribution分布给出true
或false
结果(默认分别转换为1
和0
)。
// returns true or false
bool randomly_true(double p = 0.5)
{
thread_local static std::mt19937 mt{std::random_device{}()};
thread_local static std::bernoulli_distribution d;
return d(mt, std::bernoulli_distribution::param_type{p});
}
int main()
{
for(int i = 0; i < 30; ++i)
std::cout << randomly_true() << '\n';
}
输出:(样品)
0
0
0
1
0
1
1
1
0
1
如果你总是希望1
或0
整数值,而不是true
或false
布尔值,您可以通过从函数返回int
强制转换:
// returns 1 or 0
int randomly_true(double p = 0.5)
{
thread_local static std::mt19937 mt{std::random_device{}()};
thread_local static std::bernoulli_distribution d;
return d(mt, std::bernoulli_distribution::param_type{p});
}
注意:您应该优先使用此库,而不是rand()
,因为rand()
不能保证质量,可能执行得很差。
通常你应该使用这个库而不是C风格的rand(),这对于低质量的实现是臭名昭着的。 –
值得注意的是,使用Mersenne Twister和它的2.5 KiB状态加上伯努利分布以及它的浮点计算(当你可以取任何一点MT输出)来决定它是tic还是tac它是可笑的。保留最低级别的LCG(或者更好,XorShift家族的任何成员)会很好。难怪他们认为软件不断扩展以做同样的事情,浪费不断增加的硬件资源。 –
@MatteoItalia在实际的应用程序中,您将为所有随机需求重复使用相同的随机数生成器,并且分发应该只提取每次调用所需的位数(它们是有状态的)。此外,标准库也提供LCG,如果这是您所需要的。 – Galik
如果你有'C++ 11',那么[std :: bernoulli_distribution](http://en.cppreference.com/w/cpp/numeric/random/bernoulli_distribution)可能对你有用。 – Galik
@Galik这是一个很棒的答案。请让它成为答案? – sehe
就像'rand()%2'一样简单。 – HolyBlackCat