読者です 読者をやめる 読者になる 読者になる

Boost.Random シードの再設定

C++

Boost.Randomのジェネレータでシードの再設定をするには、ジェネレータのseed()メンバ関数を使用します。
この関数は、ジェネレータのコンセプトとして規定されているので、Boost.Randomの全てのジェネレータで同じように使用できます。


以下は、メルセンヌ・ツイスターの例:

#include <iostream>
#include <boost/random.hpp>

int main()
{
    std::size_t seed = 0;

    boost::random::mt19937 gen(seed);

    for (int i = 0; i < 3; ++i) {
        std::cout << gen() << std::endl;
    }

    std::cout << "--" << std::endl;

    gen.seed(seed); // シードを再設定
    for (int i = 0; i < 3; ++i) {
        std::cout << gen() << std::endl;
    }
}
2357136044
2546248239
3071714933
--
2357136044
2546248239
3071714933

シード再設定後に、同じ値が生成されているのがわかります。

分布クラスを通しても同じになります:

#include <iostream>
#include <boost/random.hpp>

int main()
{
    std::size_t seed = 0;

    boost::random::mt19937 gen(seed);
    boost::random::uniform_int_distribution<> dist(0, 10);

    for (int i = 0; i < 3; ++i) {
        std::cout << dist(gen) << std::endl;
    }

    std::cout << "--" << std::endl;

    gen.seed(seed); // シードを再設定
    for (int i = 0; i < 3; ++i) {
        std::cout << dist(gen) << std::endl;
    }
}
6
6
7
--
6
6
7

ちなみに、シードを取得する機能はないようなので、シードの管理自体はユーザーが行う必要があります。