C++ 产生高斯噪声

C++ 产生高斯噪声,c++,random,eigen,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到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;
}
为此,我使用了Egeng库,我只是想知道为什么每次运行它都会产生相同的数字。

来源:

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

因此,我认为您应该了解您在这里实际使用的库堆栈,以及您在具体实现中对
random\u device
的了解

我意识到这实际上可能是一个“复制品”

此外,至少在过去,初始化一个新的
mt19937
实例会有点昂贵。因此,除了随机性的质量外,您还有性能方面的原因,无法为每个函数调用重新初始化
random_设备
mt19937
实例。我会选择某种类型的单例,除非您有非常明确的限制(在库中构建,不明确的并发性),这将使这成为一个不可接受的选择。

来自:

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

因此,我认为您应该了解您在这里实际使用的库堆栈,以及您在具体实现中对
random\u device
的了解

我意识到这实际上可能是一个“复制品”


此外,至少在过去,初始化一个新的
mt19937
实例会有点昂贵。因此,除了随机性的质量外,您还有性能方面的原因,无法为每个函数调用重新初始化
random_设备
mt19937
实例。我会选择某种类型的单例,除非你有非常明确的限制(在库中构建,不明确的并发性),这将使这成为一个不可接受的选择。

没有“0到1之间的正常数字”这样的东西。正态分布有一个无限的支持。旁注:你可以使用避免两个for循环。没有“0到1的正态数”这样的东西。正态分布有无限的支持。边注:你可以避免使用两个循环。你能建议一个修改的函数吗?我应该考虑做一个粗略的方法是转<代码> RD 和<代码> GEN <代码>静态。请注意,如果你重新运行完整的程序,它将仍然给出相同的结果,而不是在程序的单个执行过程中多次调用,我对C++有点陌生,所以你提到的一些术语我可以遵循,但是我不确定如何实现你所建议的。只需将单词
static
放在
random\u device
以及
mt19937
之前。实际上,这意味着变量是永久的,而不是在每次函数调用时重新初始化。您是在同一个程序中多次调用函数,还是多次运行同一个程序?正如我之前所写的,如果每次运行程序时都需要单独的结果,则必须找到一些其他的种子,而不是随机化设备的当前实现。您能建议一个修改的函数吗?我应该考虑这样做。粗略的方法是转换<代码> RD<代码>和<代码> GEN <代码>静态。请注意,如果你重新运行完整的程序,它将仍然给出相同的结果,而不是在程序的单个执行过程中多次调用,我对C++有点陌生,所以你提到的一些术语我可以遵循,但是我不确定如何实现你所建议的。只需将单词
static
放在
random\u device
以及
mt19937
之前。实际上,这意味着变量是永久的,而不是在每次函数调用时重新初始化。您是在同一个程序中多次调用函数,还是多次运行同一个程序?就像我以前写的那样,如果每次运行程序时都想得到不同的结果,那么除了当前的random_设备实现之外,还必须找到其他种子。
0.414089
0.225568
0.413464
 2.53933