次のクラスを実装しようとしています。
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
です。リファレンスによると、各ディストリビューション インスタンスにはreset()
メンバー関数があります。つまり、潜在的に大きな内部状態またはキャッシュがある可能性があります。
私の質問は:
ディストリビューションには内部状態がありますか? はいの場合、なぜですか?標準は、この状態のサイズについて何か言っていますか?
私のように実装するのは良い考えですか?より良い方法はありますか?