我是一个C ++新手,我很难过。我需要在我的main函数中调用这个函数三次,但每次它给我相同的结果,即pull_1,pull_2,pull_3是相同的。我需要做些什么来使它们实际上是随机的?
string PullOne()
{
string pick;
string choices[3] = {"BAR", "7", "cherries"};
std::srand(time(0));
pick = choices[(std::rand() % 3)];
return pick;
}
从我的主要功能:
string pull_1, pull_2, pull_3;
pull_1 = PullOne();
pull_2 = PullOne();
pull_3 = PullOne();
你不应该在每次打电话给srand()
之前打电话给rand()
。称之为一次 - 在程序开始时的某个地方。
问题是你重新启动随机生成器,因此它开始从同一点生成完全相同的伪随机序列。
每次调用srand
时,随机数生成器都会重置为初始状态,该状态由种子值决定。在连续调用time
之间的时间值可能相同,因此生成相同的种子和相同的数字。
在生成随机样本之前,只在主函数中调用一次种子函数(srand
)。
你为什么一直打电话给std::srand(time(0));
?重新播种PRNG ....并且因为这一切都在同一秒内发生,所以你总是以相同的顺序重新播种它。
在你的程序中调用srand
一次,只调用一次。
此外,我建议,至少在符合POSIX标准的系统上,像std::srand(time(0) ^ getpid())
这样的东西,这样你就可以在相同的“秒”内运行你的程序两次并仍然得到一个新的PRNG序列。
time(0)
函数可能没有在函数调用之间“勾选”。因此,您每次都使用相同的值为随机数生成器播种,从而导致rand()
的值相同
您的问题是每次调用该函数时都会对RNG进行种子处理。您应该只在程序中播种一次,以获得最佳效果。如果希望结果从程序的一次执行变为下一次,则根据time()函数的结果进行srand。