C++ 11 標準ライブラリの乱数分布を、分布のパラメーターとジェネレーター インスタンスを引数として取る単純な関数でラップしたいと考えています。例えば:
double normal(double mean, double sd, std::mt19937_64& generator)
{
static std::normal_distribution<double> dist;
return dist(generator, std::normal_distribution<double>::param_type(mean, sd));
}
このラッパー関数への各呼び出しが指定された引数のみに依存するように、配布オブジェクト内の非表示の状態を回避したいと考えています。(潜在的に、この関数への各呼び出しは異なるジェネレーター インスタンスを取ることができます。) 理想的には、static const
これを確実にするためにディストリビューション インスタンスを作成します。ただし、分布operator()
は定数関数ではないため、これは不可能です。
私の質問は次のとおりです。ディストリビューション内に隠された状態がないことを確認するには、1)reset()
ディストリビューションを毎回呼び出す必要があり、2) 十分ですか? 例えば:
double normal(double mean, double sd, std::mt19937_64& generator)
{
static std::normal_distribution<double> dist;
dist.reset();
return dist(generator, std::normal_distribution<double>::param_type(mean, sd));
}
(全体として、ランダム分布の関数の目的について混乱していreset()
ます...ジェネレーターを時々リセット/再シードする必要がある理由を理解していますが、なぜ分布オブジェクトをリセットする必要があるのでしょうか?)