Boost の正規分布を使用して、異なるシードを指定して乱数を生成しようとしています。つまり、seed1、seed2 などに対して生成された同じ乱数が必要です。シミュレーション中に数千のシードが関数に渡されます。乱数ジェネレーターがシードなしで使用されることはありません。[編集: 「キー」は「シード」よりも適切な言葉です。以下の最終的な説明ブロックを参照してください。]単一の RNG を生成して再シードすることが最も理にかなっているのか (もしそうなら、どのように) または毎回新しいものを生成する方が簡単な場合。ここに私がこれまでに持っているものがあります。これには、ランダムな正規数のリクエストごとに新しいシードされた rng の構築が含まれます。
double rnorm( int thisSeed ) {
boost::mt19937 rng( thisSeed );
boost::normal_distribution<> nd( 0.0, 1.0 ); // (mean, sd)
boost::variate_generator > var_nor( rng, nd );
return var_nor();
}
これはばかげていますか?PRNG、特に Boost の実装は初めてです。
私がこれを行っている理由のより完全な説明:
タンパク質相互作用をシミュレートするために巨大なランダム エネルギー ランドスケープを作成しています。各配列には、特定の位置の特定のアミノ酸の値 (および他のいくつかの配列属性) に依存する消光ガウス乱数の合計として計算される特定のエネルギーがあります。PRNG を使用して、これらの疑似乱数の値を計算したいと思います。これらの値は一貫している必要があります (同じシーケンスは同じ値を生成する必要があります) が、格納するには多すぎます。簡単な例として、シーケンス ARNDAMR があり、2 つのサブエネルギーに基づいてその総エネルギーを計算するとします。最後の 3 つのアミノ酸に依存します。私' PRNG のシード (引数) として使用するために、構成をキーに変換します。何千ものシーケンスが構築されて変異するため、エネルギーをすばやく計算する方法が必要です。そのため、RNG をシードして呼び出す最善の方法を知る必要があります。これらのエネルギー値の「ルックアップ」以外の目的でブースト RNG を使用することはありません。
さらに(tl;dr)説明:
1 から 10^6 または 10^7 までの整数である「キー」値を使用します。それぞれをガウス乱数にマップしたい。キー値とその数値の間に相互相関があってはなりません (たとえば、キー 145 ~ 148 は自己相関の「乱数」にマップされるべきではありません)。
シミュレーションでキー (キー) が呼び出されるたびに同じ乱数を返すには、特定のキーが必要です。キーと乱数のペアをルックアップ テーブルに格納したくありません。