我使用以下例程生成从高斯/正态分布中选择的随机数:
当所有内容都在一个文件中进行编译时,它非常简单:
#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
。 e2
文件中为.C
播种,该文件加载包含种子所在位置的参数文件。dist(e2)
文件中使用.C
,无论我生成此号码。 我的尝试:
在我写的头文件中:
#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
从dist(e2)
生成一个数字时,我得到一个非静态成员函数错误,如上所示。
如何实现这一目标的任何帮助将非常感激。
答案 0 :(得分:2)
那是因为在第一个例子中你声明了一个变量e2
和dist
,在第二个例子中你定义了函数。
你想要的是这个标题:
#include <random>
std::mt19937 e2;
std::normal_distribution<float> dist;
在您的主要或.C
文件中,您应该:
e2 = std::mt19937(seed);
dist = normal_distribution<float>(m, sqrt(v));
此外,您应该包含一个标头防护以防止多个声明。我假设你已经有了一个但是为了简洁而没有包含它。
答案 1 :(得分:2)
您创建了包含2个函数声明的标题
std::mt19937 e2(int sd);
std::normal_distribution<float> dist(double meanNormal, double varNormal);
function f2
接受一个参数并返回std::mt19937
个对象,函数dist
接受两个参数并返回std::normal_distribution
个对象。
在主文件中,您通过
e2(seed); //seed read from file before.
dist(mean,sqrt(var)); //mean and var are double variables defined in this file.
你在这一行中遇到了编译器错误
ls[i] = dist(e2); // <----
因为你想以dist
函数作为参数调用e2
函数,所以不可能。 dist
函数需要两个双参数。
如果您想将dist
和e2
视为全局变量以在多个源文件中生成随机值,您可以像这样在头函数中声明
double myrandom ();
并将其定义为
double myrandom ()
{
static mt19937 e2(100);
static normal_distribution<float> dist(0.0, sqrt(0.05));
// e2 and dist will be created during first call of this function
return dist(e2);
}
答案 2 :(得分:2)
你不能这样做。 std::mt19937 e2(int sd);
不确定为什么你认为这会起作用......正如所指出的那样声明了一个函数。
你可以做的是把
std::mt19937 e2;
在头文件中,然后从.cpp文件调用
e2.seed(something);
然而,这似乎是一个很好的机会让一个小班为你封装这个。
class RNG_class {
private:
std::mt19937 e2;
std::normal_distribution<float> dist;
public:
RNG_class(int seed, double meanNormal, double varNormal) : e2(seed), dist(meanNormal, varNormal) {}
float get() {
return dist(e2);
}
};
从.cpp
开始,您可以
RNG_class rng(100, m, sqrt(v));
...
ls[i] = rng.get();