将某些 RNG(如 std::mt19937
)的实例声明并作为全局变量作为种子是危险/错误的形式吗?这样,任何使用随机数的函数调用本质上都是针对给定种子同步的。也就是说,对于给定的种子,我的整个程序将以相同的方式运行。除了潜在的错误,这是否也牺牲了任何随机性?
在 main() 中声明它然后只传递对它的引用以供函数中的任何后续使用是更好的选择吗?
预先感谢您的帮助!
最佳答案
全局 RNG 不会牺牲任何随机性,但它就像使用任何其他全局变量一样:
- 它简化了初始实现。
- 它会使 future 的发展更加困难。 (例如,出于单元测试目的,您可能想要指定具有可重复序列的特定 RNG 实例。)
- 它引入了线程安全问题。 (两个线程同时访问全局 RNG 成为竞争条件。)
传统观点认为全局变量和单例变量造成的问题多于它们解决的问题,但您必须自己决定如何权衡您的程序。
关于c++ - 定义和播种具有全局范围的伪随机数生成器 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28728370/