1

正規分布から乱数を生成しようとしています。コードの場合:

normal(eng)

main()に表示され、プログラムは正常に動作します。ただし、別の関数から呼び出された場合、mainからの次の呼び出しは、以前に生成されたものと同じ値を返します。以下はこれを説明するいくつかのコードです。出力の最初の数行は次のとおりです。

-0.710449
-0.710449
0.311983
0.311983
1.72192
1.72192
0.303135
0.303135
0.456779
0.456779

なぜこれが起こるのか誰かが知っていますか?

コンパイラは、Windowsではgcc4.4.1です。

#include <iostream>
#include <cmath>
#include <ctime>
#include <tr1/random>

typedef std::tr1::ranlux64_base_01 Engine;
//typedef std::tr1::mt19937 Engine;
typedef std::tr1::normal_distribution<double> Normal;

double random_normal(Engine eng, Normal dist) {
    return dist(eng);
}

int main ( int argc, char** argv ) {
    Engine eng;
    eng.seed((unsigned int) time(NULL));

    Normal normal(0,1);

    for (int i = 0; i < 100; i++)
    {
        std::cout << random_normal(eng, normal) << std::endl;
        std::cout << normal(eng) << std::endl;   
    }

    return 0;
}
4

1 に答える 1

3

これは、エンジンを値でrandom_normalに渡しているために発生しています。random_normalはエンジンのコピーを取得するため、元のエンジンの状態は変更されません。その元のエンジンを直接使用すると、取得したrandom_normalと同じ結果が得られます。

random_normalを変更して、参照によってエンジンを取得する場合:

double random_normal(Engine &eng, Normal Dist);

その後、元のエンジンが変更され、値が繰り返されることはありません。すべての標準ディストリビューションは、参照によりエンジンを使用します。例えば:

template<class IntType = int>
class uniform_int_distribution
{
...
    // generating functions
    template<class URNG>
    result_type operator()(URNG& g);
于 2012-05-11T18:07:05.497 に答える