使用C ++ TR1生成随机数

时间:2012-05-11 18:02:18

标签: c++ random distribution tr1 normal-distribution

我正在尝试从正态分布中生成随机数。当代码:

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上的gcc 4.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;
}

1 个答案:

答案 0 :(得分: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);