定义和播种具有全局范围的伪随机数生成器 (C++)
Defining & seeding pseudo-random number generator with global scope (C++)
是否以 dangerous/bad 形式将某些 RNG(如 std::mt19937
)的实例声明和播种为全局变量?这样,任何使用随机数的函数调用本质上都是针对给定种子同步的。也就是说,对于给定的种子,我的整个程序将 运行 相同。除了潜在的错误,这是否也牺牲了任何随机性?
是否更好的选择是在 main() 中声明它,然后只传递对它的引用以供函数中的任何后续使用?
在此先感谢您的帮助!
全局 RNG 不会牺牲任何随机性,但就像使用任何其他全局变量一样:
- 它简化了初始实施。
- 这会让以后的发展更加困难。 (例如,出于单元测试目的,您可能想要指定具有可重复序列的特定 RNG 实例。)
- 它引入了线程安全问题。 (两个线程同时访问全局 RNG 成为竞争条件。)
传统观点认为全局变量和单例变量造成的问题多于它们解决的问题,但您必须自己决定如何权衡您的程序。
是否以 dangerous/bad 形式将某些 RNG(如 std::mt19937
)的实例声明和播种为全局变量?这样,任何使用随机数的函数调用本质上都是针对给定种子同步的。也就是说,对于给定的种子,我的整个程序将 运行 相同。除了潜在的错误,这是否也牺牲了任何随机性?
是否更好的选择是在 main() 中声明它,然后只传递对它的引用以供函数中的任何后续使用?
在此先感谢您的帮助!
全局 RNG 不会牺牲任何随机性,但就像使用任何其他全局变量一样:
- 它简化了初始实施。
- 这会让以后的发展更加困难。 (例如,出于单元测试目的,您可能想要指定具有可重复序列的特定 RNG 实例。)
- 它引入了线程安全问题。 (两个线程同时访问全局 RNG 成为竞争条件。)
传统观点认为全局变量和单例变量造成的问题多于它们解决的问题,但您必须自己决定如何权衡您的程序。