c++ - 使用头文件定义 mt19937 和 normal_distribution

标签 c++ random header-files gaussian normal-distribution

我正在使用以下例程生成从高斯/正态分布中选择的随机数:

当所有内容都在一个文件中进行编译时,它相当简单:

#include <iostream>
#include <math.h>
#include <random>

using namespace std;

int main()
{
    double m;
    double v;
  int seed=100; 
    int samplesize=10;
    double ls [samplesize]; //to store as a list

    m = 0.0;
    v = 0.05;
    mt19937 e2(seed);

    normal_distribution<float> dist(m, sqrt(v));

  for (int i=0; i<samplesize; i++){
        ls[i] = dist(e2);
        cout << ls[i] << endl;
    }

    return 0;
}

现在我正在尝试做类似的事情,但我希望能够全局定义 e2dist,或者只是先在听者文件中定义 .h 然后在我程序的各种 .C 文件中调用它们。 我的尝试不断遇到 error: invalid use of non-static member function ‘std::mt19937 e2(int)’ 类错误。

目的是:

  • 在头文件中定义e2dist
  • .C 文件中为 e2 播种,该文件加载包含给定种子位置的参数文件。
  • 在我的 .C 文件中使用 dist(e2) 生成这样的数字。

我的尝试:

在我写的头文件中:

#include <random>

std::mt19937 e2(int sd); //sd for seed to be read from file later.
std::normal_distribution<float> dist(double meanNormal, double varNormal); //define generally, mean and var to be read from file.

然后在我读取参数的 setup.C 文件中,我尝试生成 e2dist 的实例:

e2(seed); //seed read from file before.
dist(mean,sqrt(var)); //mean and var are double variables defined in this file. 

现在在我的主程序文件中,当我尝试使用 dist(e2)dist 生成一个数字时,我得到一个非静态成员函数错误,如上所示. 非常感谢任何有关如何实现这一目标的帮助。

最佳答案

那是因为在第一个示例中,您声明了一个变量 e2dist,而在第二个示例中您定义了函数。

你想要的是这个标题:

#include <random>

std::mt19937 e2;
std::normal_distribution<float> dist;

在您的主文件或 .C 文件中,您应该:

e2 = std::mt19937(seed);
dist = normal_distribution<float>(m, sqrt(v));

您还应该包含一个 header 保护以防止多次声明。我假设您已经有了一个,但为简洁起见没有包括在内。

关于c++ - 使用头文件定义 mt19937 和 normal_distribution,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48925092/

相关文章:

c++ - 在不同线程中作为一个类的成员函数使用安全吗?

Java生成非重复随机数

C++ 多个文件和包含 header

c++ - 是否必须让默认构造函数在 C++ 中使用统一初始化

c++ - 在 boost MPL 中,如何检查操作是否按预期进行?

python - 有效地生成大量有偏差的抛硬币

c++ - 我们如何生成一定数量的随机数并将它们相互链接,而无需将数字链接到自身?

c++ - 为什么 "int i"有多个定义?

c++ - 在头类中创建内联函数到私有(private)变量

c++ - 复制 CCSprite