随机布尔值

时间:2011-12-07 21:19:30

标签: c++ random ctime

我正在尝试在C ++中生成一个0或1的随机int。现在,每次运行此代码时都会收到0,我不知道为什么。这有什么问题?

#include <ctime>
#include <cstdlib>

srand(time(0));
int randomval = rand() % 2;
cout << randomval << endl;

8 个答案:

答案 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;