生成高斯噪声

时间:2017-02-04 17:48:57

标签: c++ random eigen

我创建了一个函数,假设生成一组从0到1的正常随机数。虽然,似乎每次运行函数时输出都是相同的。我不确定是什么问题。

以下是代码:

MatrixXd generateGaussianNoise(int n, int m){
    MatrixXd M(n,m);
    normal_distribution<double> nd(0.0, 1.0);
    random_device rd;
    mt19937 gen(rd());
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            M(i,j) = nd(gen);
        }
    }
    return M;
}

n = 4m = 1

时的输出
0.414089
0.225568
0.413464
 2.53933

我使用了Eigen库,我只是想知道为什么每次运行它都会生成相同的数字。

1 个答案:

答案 0 :(得分:4)

自: http://en.cppreference.com/w/cpp/numeric/random/random_device

  如果非确定性源(例如,硬件设备)对于实现不可用,则可以根据实现定义的伪随机数引擎来实现std :: random_device。在这种情况下,每个std :: random_device对象可以生成相同的数字序列。

因此,我认为您应该查看您在这里实际使用的库堆栈,以及您在特定实现中对random_device的了解。

我意识到这可能实际上是&#34; Why do I get the same sequence for every run with std::random_device with mingw gcc4.8.1?&#34;的复制品。

此外,它至少曾经是初始化一个新的mt19937实例会有点贵。因此,除了随机性质之外,您还有性能原因,无法为每个函数调用重新初始化random_devicemt19937实例。我会在这里寻找某种单身,除非你有非常明确的限制(在库中构建,不清楚的并发性),这将使这成为一个不可靠的选择。