2

C++11 #include<random>またはを使用して、Boost C++ Boost.Random1つのシードを使用して、選択可能な任意のシーケンスで乱数ジェネレーターを開始することは可能ですか?

言い換えれば、同じシードを使用しながら、シーケンスのどこで数値ジェネレーターが開始するかを特定できるようにしたいのです。

たとえばmt19937、サイクルの長さのジェネレーターを使用している場合、サイクル2^19937-1の長さのユーザー指定の位置で乱数の生成を開始したいと思います。1000を選択すると、ジェネレーターはサイクルの長さの1000番目の位置から開始します。

4

1 に答える 1

8

はい。あなたのためにこれを行うメンバーdiscard(unsigned long long z)がいます。例えば:

#include <random>
#include <cassert>

int main()
{
    std::mt19937 e1(6492);
    std::mt19937 e2(6492);
    const int N = 1000;
    for (int i = 0; i < N; ++i)
        e1();
    e2.discard(N);
    assert(e1() == e2());
}

このプログラムはアサートすべきではありません。

于 2013-03-15T02:44:21.960 に答える