我使用以下例程生成从高斯/正态分布中选择的随机数:
当所有内容都放在一个要编译的文件中时,它是非常简单的:
#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文件中播种.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生成一个数字时,我会得到一个非静态成员函数错误,如上面所示。在如何实现这方面的任何帮助都将不胜感激。
发布于 2018-02-22 11:03:14
这是因为在第一个示例中,您声明了变量e2和dist,而在第二个示例中,您定义了函数。
您想要的是这个标题:
#include <random>
std::mt19937 e2;
std::normal_distribution<float> dist;在主文件或.C文件中,您应该:
e2 = std::mt19937(seed);
dist = normal_distribution<float>(m, sqrt(v));此外,您还应该包括一个头部保护,以防止多个声明。我想你已经有一个了,但为了简洁起见没有把它包括在内。
发布于 2018-02-22 11:05:29
您创建了包含两个函数声明的标头
std::mt19937 e2(int sd);
std::normal_distribution<float> dist(double meanNormal, double varNormal);函数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);
}发布于 2018-02-22 11:23:47
你不能这么做。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();https://stackoverflow.com/questions/48925092
复制相似问题