我是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();
答案 0 :(得分:16)
在每次致电srand()
之前,您都不应致电rand()
。在程序开始的某个地方调用一次。
问题是你重启了随机生成器,所以它开始从同一点产生完全相同的伪随机序列。
答案 1 :(得分:15)
每次调用srand
时,随机数生成器都会重置为初始状态,该状态由种子值决定。连续调用time
之间的时间值可能相同,因此生成相同的种子和相同的数字。
在生成随机样本之前,只在主函数中调用一次种子函数(srand
)。
答案 2 :(得分:7)
为什么一直打电话给std::srand(time(0));
?重新播种PRNG ....并且因为这一切都在同一秒内发生,所以你总是以相同的顺序重新播种它。
在您的计划中拨打srand
一次,只打一次。
此外,我建议至少在符合POSIX标准的系统上使用类似std::srand(time(0) ^ getpid())
的内容,以便您可以在同一“秒”内运行两次程序并仍然获得新的PRNG序列。
答案 3 :(得分:2)
函数调用之间的time(0)
函数可能没有“勾选”。因此,您每次都会为随机数生成器播放相同的值,从而导致rand()
答案 4 :(得分:1)
您的问题是每次调用此功能时都会为RNG播种。您应该只在程序中播种一次,以获得最佳效果。如果希望结果从程序的一次执行变为下一次,则根据time()函数的结果进行srand。