生成高斯噪声

Generating Gaussian Noise

本文关键字:噪声 高斯      更新时间:2023-10-16

我创建了一个函数,假设它生成一组从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库,我只是想知道为什么每次运行它都会产生相同的数字。

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

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

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

我意识到这实际上可能是"为什么我每次使用std::random_device和mingw gcc4.8.1运行都会得到相同的序列?"的重复。

此外,至少过去初始化一个新的mt19937实例会有点昂贵。因此,除了随机性的质量之外,您还有性能方面的原因,不能为每个函数调用重新初始化random_devicemt19937实例。我会在这里选择某种单例,除非你有非常明确的约束(在库中构建,不清楚的并发性),这将使它成为一个不可识别的选择。