我正在尝试在 C++ 中生成一个 0 或 1 的随机 int。现在,每次运行此代码时我都会收到 0,但我不知道为什么。这里有什么问题?
#include <ctime>
#include <cstdlib>
srand(time(0));
int randomval = rand() % 2;
cout << randomval << endl;
这叫倒霉。再试一遍。
我知道这是一个较老的问题,但我相信这可以正确回答这个问题。
不要在每次运行该代码时重新播种生成器。
通过每次将其播种到相同的值,您将获得相同的“随机”数字。请记住,这是一个伪随机数生成器,因此将根据种子值生成一个“随机”数。所以如果你每次都用相同的号码播种,你每次都会得到相同的号码。
解决方案是在程序执行中只调用一次 srand(time(NULL)) 。然后,每次调用 rand() 都会给你一个不同的号码。
理论上,你有 50% 的机会得到0
,和 50 - 1
。您可能想尝试使用不同的模数 - 例如 100,以检查这是否有效。我相信它确实如此。
您只运行了几次此代码,还不够。
测试它的其他想法:
srand(time(0));
for( int i = 0; i < 1000000; ++i )
{
assert( 0 == ( rand() % 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
bool random() {
if (rand() % 2 == 0)
return true;
else return false;
}
只需调用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;
尽管您的代码表明您希望以同样的可能性接收它们,但您没有说明这一点,也许您只是认为不可能这样做。如果您想要一个不同的发行版,并且您愿意重写您的代码(并使其符合 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)
,将所有生成的对象保持原样而不重新创建它们。
你没有检查任何东西。利用:
#include <ctime>
#include <cstdlib>
srand(time(0));
int randomval = rand() % 2 == 0;
cout << randomval << endl;