2017-09-17 124 views
-2
1的井字球员之间
int random(){ 
    double x = ((double) rand()/(RAND_MAX)); // this i tried but only 0 
    return x; 
} 

我如何生成0或随机播放生成0或1,而不是在

+0

如果你有'C++ 11',那么[std :: bernoulli_distribution](http://en.cppreference.com/w/cpp/numeric/random/bernoulli_distribution)可能对你有用。 – Galik

+0

@Galik这是一个很棒的答案。请让它成为答案? – sehe

+3

就像'rand()%2'一样简单。 – HolyBlackCat

回答

1

如果你有C++11你可以使用新的标准<random>库。特别是std::bernoulli_distribution分布给出truefalse结果(默认分别转换为10)。

// 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 

如果你总是希望10整数值,而不是truefalse布尔值,您可以通过从函数返回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()不能保证质量,可能执行得很差。

+0

通常你应该使用这个库而不是C风格的rand(),这对于低质量的实现是臭名昭着的。 –

+0

值得注意的是,使用Mersenne Twister和它的2.5 KiB状态加上伯努利分布以及它的浮点计算(当你可以取任何一点MT输出)来决定它是tic还是tac它是可笑的。保留最低级别的LCG(或者更好,XorShift家族的任何成员)会很好。难怪他们认为软件不断扩展以做同样的事情,浪费不断增加的硬件资源。 –

+0

@MatteoItalia在实际的应用程序中,您将为所有随机需求重复使用相同的随机数生成器,并且分发应该只提取每次调用所需的位数(它们是有状态的)。此外,标准库也提供LCG,如果这是您所需要的。 – Galik

相关问题