c++ - 使用随机数生成器 : multiple instances or singleton approach?

标签 c++ class random singleton instance

我创建了一个可以用作随机数生成器的类,它比标准的 rand() 效果更好。下面我包含了我的类的 .cpp 文件,其中包含类变量 std::mt19937 gen 和 std::uniform_real_distribution distribution。

我的问题是是否有必要为我的号码生成器创建多个实例。例如,如果我有 A 类和 B 类,并且每个类都需要在 [0,1] 范围内采样随机数,如果 A 和 B 每个都有自己的 UniformNumberGenerator 实例会更好,还是我应该采用单例方法并使用两个类的一个实例?

UniformNumberGenerator::UniformNumberGenerator(double min, double max)
{
    gen = CreateGenerator();
    distr = std::uniform_real_distribution<double>(min, max);
}

std::mt19937 UniformNumberGenerator::CreateGenerator()
{
    std::random_device rd;
    std::mt19937 result(rd());
    return result;
}

//Take a sample
double UniformNumberGenerator::operator()()
{
    return distr(gen);
}

最佳答案

拥有多个伪随机数生成器 (PRNG) 实例的一个正当理由是使用相关归纳策略提高两个系统之间差异的模拟估计精度。其中最简单的是“common random numbers”(CRN)*。直觉上,如果你的银行或杂货店有两种不同的安排,并且你想确定哪种配置最有效,将它们与完全相同的一组客户和交易进行比较是有意义的。 CRN 通过为两种情况生成完全相同的 PRN 序列来做到这一点,但您必须非常小心地保持 PRNG 流同步。如果两个系统具有不同数量的永久实体(例如服务器),这将是一个真正的挑战。在这种情况下,每个服务器一个 PRNG 是合适的,一个 PRNG 也可以为每个到达流生成特征。所有 PRNG 都将在一次运行中独立播种(因此服务器看起来彼此独立),并且在运行之间以相同的方式播种以产生运行级同步。

底线——除非您计划使用相关归纳策略来减少方差并且您真的确定您知道自己在做什么,否则您应该使用单个 PRNG。 MT19937 为相当大的 k 值生成顺序不相关的 k 元组,如果我没记错的话超过 600。如果您的目标是生成独立样本,这正是 MT19937 和其他体面的生成器旨在通过生成器的单个实例进行模拟的目的。

* - 也有一篇关于此的维基百科文章,但目前写得非常糟糕,所以我不建议将其用作资源。

关于c++ - 使用随机数生成器 : multiple instances or singleton approach?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25360241/

相关文章:

C++ - 简单的 ifstream 错误

Javascript。什么时候必须在子类声明中使用构造函数?

c - 从数组中随机数并在 C 中删除

java - 在每次调用时生成唯一的随机数

C++ 函数指针赋值不能转换类内的类型

java - 在java中使用更长的种子生成随机数

c++ - 使用绝对指针地址作为模板参数

c++ - 如何优化和加速 C++ 中的矩阵乘法?

c++ - 派生类的调用方法

ruby - IRB 使用什么来确定如何表示返回的实例?