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

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

是否以 dangerous/bad 形式将某些 RNG(如 std::mt19937)的实例声明和播种为全局变量?这样,任何使用随机数的函数调用本质上都是针对给定种子同步的。也就是说,对于给定的种子,我的整个程序将 运行 相同。除了潜在的错误,这是否也牺牲了任何随机性?

是否更好的选择是在 main() 中声明它,然后只传递对它的引用以供函数中的任何后续使用?

在此先感谢您的帮助!

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

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

传统观点认为全局变量和单例变量造成的问题多于它们解决的问题,但您必须自己决定如何权衡您的程序。