在类中使用random_device

时间:2014-01-24 08:41:51

标签: c++ class random

这段代码的哪一部分在你的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;

1 个答案:

答案 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。