【发布时间】:2013-04-07 16:53:47
【问题描述】:
我正在尝试实现以下类:
typedef std::mt19937 Engine;
class Interval
{
public:
double upperBoundary;
double lowerBoundary;
double generateUniformRandomNumber(Engine& engine);
};
我希望该类在多线程环境中工作。每个线程都有自己的 Engine 对象实例,并将 Engine 传递给任何具有随机行为的类的对象。
为了以 C++11 的方式统一生成随机数,generateUniformRandomNumber 的实现必须是这样的:
uniform_real_distribution<double> distribution_; // private member of Interval
double Interval::generateUniformRandomNumber(Engine& engine)
{
return distribution_(engine);
}
问题是我不懂 C++11 发行版。我知道 C++11 随机数引擎可以是非常大的对象(几千字节),但是分布呢?起初我认为分布只是简单的函子,其中operator() 是一个pure const 函数,但它似乎既不是pure 也不是const。根据reference,每个分发实例都有一个reset()成员函数。这意味着它有一个潜在的大内部状态,或者可能是一个缓存。
我的问题是:
发行版是否有内部状态?如果是,为什么?标准是否说明了该州的规模?
像我一样进行实施是个好主意吗?有没有更好的办法?
【问题讨论】:
-
例如,我实现了一个beta distribution,它的状态实际上是两个伽马分布。
reset什么都不做,因为它唯一的要求是任何后续值都独立于以前使用的引擎。 -
@sftrabbit 那么
reset()是否存在,以防有人在您调用operator()时进行累积状态的分配?例如,每次对operator()的后续调用都可以为您提供越来越大的范围......这也解释了为什么我猜operator()不是 const? -
@Dave 是的,当您不断调用
operator()时,没有理由无法更改分布。这只是意味着结果值取决于以前的调用。