定义和播种具有全局范围的伪随机数生成器(C++)

Defining & seeding pseudo-random number generator with global scope (C++)

本文关键字:随机数生成器 C++ 范围 全局 定义      更新时间:2023-10-16

将某个RNG(如std::mt19937)的实例声明为全局变量并进行种子设定是否危险/错误?这样,任何使用随机数的函数调用本质上都是对给定种子进行同步的。也就是说,对于给定的种子,我的整个程序将以相同的方式运行。撇开潜在的bug不谈,这是否也牺牲了任何随机性?

在main()中声明它,然后将引用传递给它以供后续在函数中使用,这是更好的选择吗?

提前感谢您的帮助!

全局RNG不会牺牲任何随机性,但它就像使用任何其他全局变量一样:

  • 它简化了最初的实施
  • 它会使未来的发展更加困难。(例如,出于单元测试的目的,您可能希望指定具有可重复序列的特定RNG实例。)
  • 它引入了线程安全问题。(两个线程同时访问全局RNG将成为竞争条件。)

传统观点是,全局和单体导致的问题比解决的问题多,但你必须自己决定如何平衡你的程序。