【发布时间】:2014-10-11 04:27:17
【问题描述】:
我创建了一个类,我可以将其用作比标准 rand() 更好的随机数生成器。下面我为我的类包含了 .cpp 文件,其中包含类变量 std::mt19937 gen 和 std::uniform_real_distribution distr。
我的问题是是否有必要创建我的号码生成器的多个实例。例如,如果我有 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);
}
【问题讨论】:
-
这似乎毫无意义。标准库已经将随机性和分布因素精确地考虑到了应该在功能上保持独立的两个组件中:一个昂贵的 engine 生成一次(每个线程)并且永远不会再被触及,和廉价的 distribution 对象,它们根据给定的随机源产生实际数字。你在重新发明轮子,只是你的轮子有角并且是用纸糊做的。
-
您如何启动/播种您的发电机?大多数随机生成器允许种子值,它允许可重复的序列以及“随机”。如果你这样做,单例会更好。
-
我在“CreateGenerator”方法中为生成器播种。 mt19937 实例使用 std::random_device rd 播种。 @KerrekSB 当你说这两个组件应该分开时,你能解释一下吗?您需要为分布提供一个随机生成器,以使其产生一个值。
标签: c++ class random singleton instance