4

現在、8 つ以上のパイプ (スレッド) を持つマルチスレッド シミュレーション アプリケーションを実行しています。これらのパイプは、シードによって生成されたランダム シーケンスに依存する非常に複雑なコードを実行します。次に、シーケンスは単一の 0/1 に煮詰められます。

メインスレッドから処理パイプにシードを渡した後、この「ランダム処理」を 100% 決定論的にしたいと考えています。したがって、2 回目の実行で結果を再現できます。

たとえば、(私はこれをコーディングしており、動作します)

Pipe 1 -> Seed: 123 -> Result: 0
Pipe 2 -> Seed: 123 -> Result: 0
Pipe 3 -> Seed: 589 -> Result: 1

これらのプロセスを 1 億回以上実行し、結果を平均化する必要がある場合に問題が発生します。100M のうち 1 つだけが 1 で、残りは 0 である可能性があります。明らかなように、32 ビット シードを に供給して 100M のランダムな値をサンプリングすることはできませんsrand()

VS2010 で 64 ビット シードを使用して srand() にシードすること、または同等のアプローチを使用することは可能ですか?

rand() は 2^32 の後に繰り返されますか、それとも繰り返されませんか (内部に隠れた状態があります)?

ありがとう

4

5 に答える 5

3

C++11 の乱数機能を使用して、特定のサイズとシード サイズの乱数を生成できますが、そのプロセスは少し複雑すぎてここで要約することはできません。

たとえば、 を構築std::mersenne_twister<uint64_t, ...>して 64 ビット整数でシードし、指定された分布内で乱数を取得できます。これは、探しているもののようです。

于 2013-11-01T20:13:57.907 に答える
3

シンプルな 64 ビット LCG でニーズを満たすことができます。LCG のビット n (ビット 1 として最下位からカウント) の周期は最大で (そして、パラメーターが正しく選択されている場合は正確に) 2^n であるため、下位ビットが必要ない場合は使用しないでください。 /または出力でテンパリング機能を使用します。サンプルの実装は、別の質問に対する私の回答にあります。

https://stackoverflow.com/a/19083740/379897

そして再投稿:

static uint32_t temper(uint32_t x)
{
    x ^= x>>11;
    x ^= x<<7 & 0x9D2C5680;
    x ^= x<<15 & 0xEFC60000;
    x ^= x>>18;
    return x;
}
uint32_t lcg64_temper(uint64_t *seed)
{
    *seed = 6364136223846793005ULL * *seed + 1;
    return temper(*seed >> 32);
}
于 2013-11-01T20:57:32.597 に答える
2

XOR SHIFT 疑似乱数ジェネレーターを使用できます

それは高速で、うまく機能します。これは、私の実装クラスからの実際の生成部分です。このアルゴリズムに関する情報は、疑似乱数ジェネレーターに関するウィキペディア検索で見つけました...

uint64_t XRS_64::generate(void)
{
    seed ^= seed >> 12; // a
    seed ^= seed << 25; // b
    seed ^= seed >> 27; // c
    return seed  * UINT64_C(2685821657736338717);
}

それは高速であり、初期化のためにコンストラクター内でそれを行います

XRS_64::XRS_64()
{
    seed = 6394358446697381921;
}

シードは unsigned int 64 ビット変数で、クラス内で宣言されています。

class XRS_64
{
public:
    XRS_64();
    ~XRS_64();
    void init(uint64_t newseed);
    uint64_t generate();

private :
    uint64_t seed; /* The state must be seeded with a nonzero value. */
};
于 2016-09-24T11:03:39.573 に答える