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

标签 c++ random

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

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

预先感谢您的帮助!

最佳答案

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

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

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

关于c++ - 定义和播种具有全局范围的伪随机数生成器 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28728370/

相关文章:

c++ - 有没有办法让函数返回一个类型名?

c++ - Qt 信号/插槽可更改?

java - 如何创建一个接受随机键和值java的映射?

string - 如何在 Go 中生成固定长度的随机字符串?

python - 系统之间的随机种子是否兼容?

c++ - 在 Vector 中查找值的索引,最接近输入

c++ - 有没有办法从函数返回新对象或对现有对象的引用?

c++ - constexpr end istream (sentinel) 迭代器有什么意义?

PHP/MYSQL随机足球时间表

java - 在Java中生成以N的倍数递增的随机数