这段代码的哪一部分在你的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;
答案 0 :(得分:2)
如果您正在询问如何使伪随机数生成器对象可用于所有类,则可以使用外部定义的全局变量(如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。