我正在为我的类(class)创建一个模拟抛硬币的简单程序。 (实际上,这学期的类(class)结束了,我只是在完成其余不需要的项目)。它涉及创建和调用一个函数,该函数生成一个介于 1 和 2 之间的随机数。最初,我试图在将使用它的函数中植入随机数生成器 (coinToss);但是,它没有产生随机数。每次运行程序时,它都是相同的数字,就好像我只使用了
rand()
代替
unsigned seed = time(0);
srand(seed);
rand();
然而,当我将上面的内容移到
int main()
它运行良好。
我的问题是 1) 为什么在调用它的函数中设置时它不起作用以及 (2) rand()
是如何工作的
如果 srand()
没有同时出现在同一个函数中,是否可以访问它们所做的事情?
显然,我是初学者,所以如果我没有正确提出问题,请原谅我。另外,我的书只是简要介绍了 rand()
和 srand()
,所以这就是我真正知道的全部内容。
感谢您的帮助!
相关代码:
第一次失败的尝试:
int main()
{
//...........
coinToss();
//...........
}
int coinToss()
{
unsigned seed = time(0);
srand(seed);
return 1 + rand() % 2;
}
第二次尝试成功了:
int main()
{
unsigned seed = time(0);
srand(seed);
coinToss();
}
int coinToss()
{
return 1 + rand() % 2;
}
最佳答案
您可能只想为随机数生成器播种一次。 rand()
从其内部生成器返回下一个伪随机数。每次调用 rand()
时,您都会从内部生成器中获取下一个数字。
srand()
但是设置随机数生成器的初始条件。您可以将其视为为内部随机数生成器设置“起点”(实际上它要复杂得多,但它是一个有用的认知模型)。
因此,您应该在您的应用程序中恰好调用一次 srand(time(0))
- 接近开始的某个地方。之后,您可以根据需要多次调用 rand()
!
但是
回答您的实际问题 - 第一个版本不起作用,因为 time()
返回自 纪元 以来的秒数。所以如果你在一秒钟内调用 coinToss()
几次(比如,如果你想模拟 100 次抛硬币),那么你会不断地用相同的数字为随机数生成器播种,从而重置每次都是内部状态(因此是您获得的下一个数字)。
无论如何 - 使用 time()
作为 srand()
的种子因为这个原因有点糟糕 - time()
没有不会经常改变,更糟的是,它是可预测的。如果您知道当前时间,则可以算出 rand()
将返回什么。互联网上有很多很多更好的 srand()
种子的例子。
关于C++:在 main() 之外播种随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4455177/