C++:在 main() 之外播种随机数生成器

标签 c++ random

我正在为我的类(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/

相关文章:

c++ - 无法在main中调用struct函数

c# - Random.Next 不是线程安全的并且在 .netcore 中返回 0

swift - 相同的 Int 在 Swift 中有不同的值,神秘的谜语

c++ - 将双点坐标转换为字符串

c++ - 字符串作为参数?

c++ - 在具有虚函数的类上调用 std::visit 是否安全?

c++ - Floyd 算法使用 (const vector<int>& t : flights), 存储在 't' 上的值是什么

MATLAB:如何在 parfor 中设置随机种子以产生与 serial for 相同的结果?

iphone - C/生成一个 1 到 4 之间的随机数,用 arc4random( ) 去掉 3?

python - 如何检查 random.choice 的打印值是否与 "guess"变量匹配