c++ - 在类中使用 random_device

标签 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;

最佳答案

如果您询问如何使伪随机数生成器对象可用于所有类,您可以使用外部定义的全局变量(如 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。

关于c++ - 在类中使用 random_device,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21328048/

相关文章:

java - 我可以在 Java 中执行此操作吗?

java - 如何在Java中正确实现MVC模式?

python - 随机执行一个函数

c++ - C++返回集合的接口(interface)

c++ - 配置Qt项目(.pro文件)以使用PcapPlusPlus

java - Java中ArrayList的ArrayList

python - 有效地从 numpy 数组中采样以相同数字结尾的连续整数序列?

c++ - 从非托管 dll 中的 QThread 回调到托管 C++ 主线程

c++ - 如何在 Vulkan 中子分配缓冲区

java - 随机答案的可能性