C++のTR1乱数生成スキームは、異なるスレッドのランダムエンジンの独立した状態を保持するという観点から、または独立したランダムシーケンスに対して古いCランタイムライブラリを改良しました。古いライブラリにはグローバルステートマシンがあり、これは通常悪いことです。ランダムなエンジン状態と複数の確定的な独立したランダムシーケンス
しかし、決定論的ランダムシーケンスを必要とするアルゴリズムを実装する場合、そのようなシーケンスから数値を描画する必要があるメソッドにエンジンを渡す必要があることがわかります。デザインの観点から見ると、ランダムシードを初期化するコードは、スタックのどのメソッドが乱数を使用しているかを知る必要はありません。ので、まだそれらの内側の方法は、自分のランダムエンジンを初期化することはできません。
- は、彼らが
- メモリ要件は、多くの下流のクライアントのために別々の状態を保っ防ぐユニークな再現性のある種子を作成するための知識が不足している
明確にするために、下流のメソッドはメインメソッドと同じシーケンスから数値を引き出す必要はありませんが、別々の実行で独立して再現可能である必要があります。
この難解な問題をどのように解決するかについてのアイデアはどれですか?
EDIT
あなたのアーキテクチャに関するいくつかの詳細を知らなくても、状況
typedef std::mt19937 RandEng;
class PossibleRandomConsumer;
class RandomProvider {
public:
void foo() {
std::uniform_int<> uni;
uni(eng, 17); // using the random engine myself
std::for_each(children.begin(), children.end(), [](PossibleRandomConsumer& child) {
// may or may not need a random number. if it does, it has to be different than from other children, and from other providers
child.DoSomething(eng);
});
}
private:
RandEng eng; // unique seed per RandomProvider
std::array<PossibleRandomConsumer,10000> children; // lots of these...
};
複数の乱数シーケンスが実際に必要ですか、または1つのグローバルRNGで十分ですか? – thiton
それぞれの 'クライアント'は異なるシーケンスを必要とします。同じエンジンを各クライアントに順番に渡すと(グローバルRNGのような)ジョブが実行されますが、それを渡すことはエレガントではありません。 – killogre
@killogre:それについては何が違うのですか?あなたは仕事をするために必要な情報を各関数に渡しています。それにはRNGが必要なので、RNGに渡します。 –