32

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

#include <ctime>
#include <cstdlib>

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

8 回答 8

215

这叫倒霉。再试一遍。

于 2011-12-07T21:22:25.490 回答
28

我知道这是一个较老的问题,但我相信这可以正确回答这个问题。

不要在每次运行该代码时重新播种生成器。

通过每次将其播种到相同的值,您将获得相同的“随机”数字。请记住,这是一个伪随机数生成器,因此将根据种子值生成一个“随机”数。所以如果你每次都用相同的号码播种,你每次都会得到相同的号码。

解决方案是在程序执行中只调用一次 srand(time(NULL)) 。然后,每次调用 rand() 都会给你一个不同的号码。

于 2014-02-19T19:02:15.290 回答
4

理论上,你有 50% 的机会得到0,和 50 - 1。您可能想尝试使用不同的模数 - 例如 100,以检查这是否有效。我相信它确实如此。

您只运行了几次此代码,还不够。

测试它的其他想法:

srand(time(0));
for( int i = 0; i < 1000000; ++i )
{
    assert( 0 == ( rand() % 2 ) );
}
于 2011-12-07T21:23:51.090 回答
2

我想补充一点,当您使用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
于 2015-01-27T15:08:27.653 回答
2
bool random() {
    if (rand() % 2 == 0)
        return true;
    else return false;
}
于 2018-04-25T22:58:51.270 回答
0

只需调用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;
于 2015-01-30T10:43:51.280 回答
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),将所有生成的对象保持原样而不重新创建它们。

于 2020-04-25T06:17:42.523 回答
-2

你没有检查任何东西。利用:

#include <ctime>
#include <cstdlib>

srand(time(0));
int randomval = rand() % 2 == 0;
cout << randomval << endl;
于 2017-05-03T15:38:17.233 回答