我正在尝试在C ++中生成一个0或1的随机int。现在,每次运行此代码时都会收到0,我不知道为什么。这有什么问题?
#include <ctime>
#include <cstdlib>
srand(time(0));
int randomval = rand() % 2;
cout << randomval << endl;
答案 0 :(得分:144)
这叫坏运气。再试一次。
答案 1 :(得分:21)
我知道这是一个较老的问题,但我相信这会正确回答这个问题。
每次运行该代码时都不要重新生成生成器。
每次将它播种到相同的值,你就会获得相同的“随机”数字。请记住,这是一个伪随机数生成器,因此根据种子值,将生成一个“随机”数字。因此,如果每次你每次都得到相同的数字,你就用相同的数字播种它。
解决方案是在程序执行中只调用一次srand(time(NULL))。然后,每次调用rand()每次都会给你一个不同的数字。
答案 2 :(得分:4)
理论上,你有50%的机会获得0
和50 - 1
。您可能想尝试使用不同的模数 - 例如100,以检查是否有效。我确信它确实如此。
您刚刚运行此代码几次,还不够。
测试它的其他想法:
srand(time(0));
for( int i = 0; i < 1000000; ++i )
{
assert( 0 == ( rand() % 2 ) );
}
答案 3 :(得分:1)
我想补充一点,当你使用srand(time(0));
时,“随机数”在同一秒内总是相同的。当我试图运行你的程序10000次并通过uniq分组时,我看到这个数字不会在一秒内改变。
for i in `seq 1 10000`; do ./a.out; done | uniq -c
693 0
3415 1
675 0
673 1
665 0
674 1
668 0
711 1
694 0
673 1
459 0
答案 4 :(得分:1)
bool random() {
if (rand() % 2 == 0)
return true;
else return false;
}
答案 5 :(得分:0)
尽管您的代码建议您希望获得同样的可能性,但您并未声明,也许您只是以为不可能做到这一点。如果您希望使用其他发行版,并且愿意重写代码(并使之符合C ++ 11),则可以执行以下操作:
const double chance = 0.3; // this is the chance of getting true, between 0 and 1;
std::random_device rd;
std::mt19937 mt(rd());
std::bernoulli_distribution dist(chance);
bool result = dist(mt);
如果您需要循环执行此操作,请仅重复最后一条语句dist(mt)
,将所有生成的对象保持原样,而无需重新创建它们。
答案 6 :(得分:-1)
只需拨打srand(time(NULL));
一次。
然后使用这样的循环,你总是这样得到0或1。
#include <stdio.h>
#include <stdlib.h>
srand(time(NULL));
for (i=0;i<10;i++)
{
printf("%d\n",rand() % 2);
i++;
}
return 0;
答案 7 :(得分:-1)
你没有检查任何事情。使用:
#include <ctime>
#include <cstdlib>
srand(time(0));
int randomval = rand() % 2 == 0;
cout << randomval << endl;