在单个函数中调用时,rand()返回相同的值

问题描述 投票:6回答:5

我是一个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();
c++ random
5个回答
16
投票

你不应该在每次打电话给srand()之前打电话给rand()。称之为一次 - 在程序开始时的某个地方。

问题是你重新启动随机生成器,因此它开始从同一点生成完全相同的伪随机序列。


15
投票

每次调用srand时,随机数生成器都会重置为初始状态,该状态由种子值决定。在连续调用time之间的时间值可能相同,因此生成相同的种子和相同的数字。

在生成随机样本之前,只在主函数中调用一次种子函数(srand)。


7
投票

你为什么一直打电话给std::srand(time(0));?重新播种PRNG ....并且因为这一切都在同一秒内发生,所以你总是以相同的顺序重新播种它。

在你的程序中调用srand一次,只调用一次。

此外,我建议,至少在符合POSIX标准的系统上,像std::srand(time(0) ^ getpid())这样的东西,这样你就可以在相同的“秒”内运行你的程序两次并仍然得到一个新的PRNG序列。


2
投票

time(0)函数可能没有在函数调用之间“勾选”。因此,您每次都使用相同的值为随机数生成器播种,从而导致rand()的值相同


1
投票

您的问题是每次调用该函数时都会对RNG进行种子处理。您应该只在程序中播种一次,以获得最佳效果。如果希望结果从程序的一次执行变为下一次,则根据time()函数的结果进行srand。

© www.soinside.com 2019 - 2024. All rights reserved.