4

私はいくつかの乱数生成を行っており、怪しい動作をしています。これが私のコードです:

    // initialized earlier... in the constructor of a class
    boost::mt19937 *rng = new boost::mt19937();
    rng->seed(time(NULL));

    // actual use here.
    for (int i = 0; i < 10; ++i)
    {
        test();
    }


    void test()
    {
       boost::normal_distribution<> distribution(10, 10);
       boost::variate_generator< boost::mt19937, boost::normal_distribution<> > resampler(*rng, distribution);

       const double sample = (resampler)(); // always the same value.
    }

ブーストでランダムサンプリングを誤用していますか? それを常に同じ値にするために、私は何を間違えましたか。コンストラクターで乱数ジェネレーターを初期化するので、常に別の値を吐き出す必要があります (再初期化されません)。

4

3 に答える 3

0

「理由」は他の回答で取り上げられています。再シードせずに修正する方法は次のとおりです(ジェネレーターを使用するポイントを無効にします):初期化normal_distributionしてvariate_generator一度、mt19937.

クラスでは、これらのメンバーを適切な順序で定義するように注意してください。

補足として、「new」は役に立たないので、単に次のように書くことができます:

boost::mt19937 rng ;
于 2014-08-26T19:14:33.230 に答える