首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用头文件定义mt19937和normal_distribution

使用头文件定义mt19937和normal_distribution
EN

Stack Overflow用户
提问于 2018-02-22 10:29:55
回答 3查看 1.4K关注 0票数 0

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

当所有内容都放在一个要编译的文件中时,它是非常简单的:

代码语言:javascript
复制
#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文件中播种.C
  • 在我的dist(e2)文件中使用.C文件,只要我必须生成这样的数字。

我的尝试:

在我编写的头文件中:

代码语言:javascript
复制
#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的实例

代码语言:javascript
复制
e2(seed); //seed read from file before.
dist(mean,sqrt(var)); //mean and var are double variables defined in this file. 

现在,在我的主程序文件中,当我试图使用dist生成一个数字时,我会得到一个非静态成员函数错误,如上面所示。在如何实现这方面的任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-22 11:03:14

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

您想要的是这个标题:

代码语言:javascript
复制
#include <random>

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

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

代码语言:javascript
复制
e2 = std::mt19937(seed);
dist = normal_distribution<float>(m, sqrt(v));

此外,您还应该包括一个头部保护,以防止多个声明。我想你已经有一个了,但为了简洁起见没有把它包括在内。

票数 2
EN

Stack Overflow用户

发布于 2018-02-22 11:05:29

您创建了包含两个函数声明的标头

代码语言:javascript
复制
std::mt19937 e2(int sd);
std::normal_distribution<float> dist(double meanNormal, double varNormal);

函数f2接受一个参数并返回std::mt19937对象,函数dist接受两个参数并返回std::normal_distribution对象。在您的主文件中,您调用了以下这些函数

代码语言:javascript
复制
e2(seed); //seed read from file before.
dist(mean,sqrt(var)); //mean and var are double variables defined in this file.

在这一行中出现了编译器错误

代码语言:javascript
复制
ls[i] = dist(e2); // <----

因为您想用dist函数作为参数调用e2函数,所以不可能。dist函数需要两个双参数。

如果要将diste2视为全局变量,以便在多源文件中生成随机值,则可以在报头函数中声明如下

代码语言:javascript
复制
double myrandom ();

并将其定义为

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-02-22 11:23:47

你不能这么做。std::mt19937 e2(int sd);

不太清楚你为什么认为那会有用..。正如所指出的,这声明了一个函数。

你能做的就是

代码语言:javascript
复制
std::mt19937 e2;

在头文件中,然后从.cpp文件调用

代码语言:javascript
复制
e2.seed(something);

然而,这似乎是一个很好的机会,可以为您创建一个小类来封装它。

代码语言:javascript
复制
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你可以做

代码语言:javascript
复制
RNG_class rng(100, m, sqrt(v));
...
ls[i] = rng.get();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48925092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档