我正在使用以下例程生成从高斯/正态分布中选择的随机数:
当所有内容都在一个文件中进行编译时,它相当简单:
#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;
}
现在我正在尝试做类似的事情,但我希望能够全局定义 e2
和 dist
,或者只是先在听者文件中定义 .h
然后在我程序的各种 .C
文件中调用它们。
我的尝试不断遇到 error: invalid use of non-static member function ‘std::mt19937 e2(int)’
类错误。
目的是:
- 在头文件中定义
e2
和dist
。 - 在
.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
文件中,我尝试生成 e2
和 dist
的实例:
e2(seed); //seed read from file before.
dist(mean,sqrt(var)); //mean and var are double variables defined in this file.
现在在我的主程序文件中,当我尝试使用 dist(e2)
从 dist
生成一个数字时,我得到一个非静态成员函数错误,如上所示.
非常感谢任何有关如何实现这一目标的帮助。
最佳答案
那是因为在第一个示例中,您声明了一个变量 e2
和 dist
,而在第二个示例中您定义了函数。
你想要的是这个标题:
#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/