在单个函数中调用时,rand()返回相同的值 我是C++新手,我对此感到困惑。我需要在我的主函数中调用这个函数三次,但每次都会得到相同的结果,即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; }

在单个函数中调用时,rand()返回相同的值 我是C++新手,我对此感到困惑。我需要在我的主函数中调用这个函数三次,但每次都会得到相同的结果,即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; },c++,random,C++,Random,从我的主要职能: string pull_1, pull_2, pull_3; pull_1 = PullOne(); pull_2 = PullOne(); pull_3 = PullOne(); 每次调用srand时,随机数生成器将重置为初始状态,该状态由种子值决定。连续调用Time之间的时间值可能相同,因此生成相同的种子和相同的号码 在生成随机样本之前,只在主函数中调用种子函数(srand)一次。在函数调用之间,时间(0)函数可能没有“勾选”。因此,您每次都使用相同的值为随机数生成器设定

从我的主要职能:

string pull_1, pull_2, pull_3;
pull_1 = PullOne();
pull_2 = PullOne();
pull_3 = PullOne();

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


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

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

生成相同的值。为什么您一直调用
std::srand(time(0))?重新播种PRNG。。。。因为这一切都发生在同一秒钟内,所以你总是用同样的顺序重新播种

在程序中调用
srand
一次,并且只能调用一次


另外,我建议,至少在POSIX兼容的系统上,使用类似于
std::srand(time(0)^getpid())
,这样您就可以在同一“秒”内运行程序两次,并且仍然可以获得一个新的PRNG序列。

您的问题是,每次调用函数时,您都要对RNG进行种子设定。为了获得最佳效果,您应该在一个程序中只播一次。如果您希望程序的一次执行与下一次执行的结果不同,srand将基于time()函数的结果。

在每次调用
rand()
之前,不应调用
srand()
。在你的计划开始时的某个地方打一次电话


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

我不知道时钟粒度与它有什么关系。“秒”是一个相当普遍的时间度量……更正了。(某些库提供亚秒分辨率,但std库不提供亚秒分辨率)。只有在同一秒内多次调用该函数,才能得到相同的结果。顺便说一句,如果使用
rand()%3
,则会在输出中引入偏差:例如,值0、1、2的概率不相同。看见