在您的 main{} 类中调用这段代码的哪一部分是合乎逻辑的,以及应该在(例如)新对象的构造函数中使用哪一部分(我应该将什么作为参数传递),以及为什么?问题更多的是,将 random_device 变量传递给对象(参数等)的最佳方式是什么?
srand ( time ( NULL ) );
std::random_device rd;
std::mt19937 mt(rd());
std::uniform_int_distribution<int> dist(1, 10);
for (int i=0; i<40; ++i)
std::cout << (int)dist(mt) << " ";
std::cout << endl;
如果您询问如何使伪随机数生成器对象可用于所有类,您可以使用外部定义的全局变量(如 std::cout),或者根据您的需要,匿名命名空间中的全局变量,或者一个单例。
然而,到目前为止,我发现的最安全、最简单的方法是为每个线程创建一个实例。以下是我的做法:
std::mt19937 &mt()
{
// initialize once per thread
thread_local static std::random_device srd;
thread_local static std::mt19937 smt(srd());
return smt;
}
现在每个线程都有自己的随机数生成器。
注意:对于 visual studio,您可以尝试使用 boost 的 thread_specific_ptr 或将 random_device 和 mersenne twister 包装在一个类中并使用 visual c++ TLS。