如何在vs2010中生成均匀分布随机数



我正在尝试创建一个包含均匀分布随机数的类。我用的是Visual Studio 2010 c++。

http://msdn.microsoft.com/en-us/library/vstudio/ee462299%28v=vs.100%29.aspxhttp://msdn.microsoft.com/en-us/library/ee462299.aspx

从这两个链接中尝试了许多组合,但我找不到适合我需要的解决方案。我现在的代码是:

) MyProblem.h

#include <random>
class MyProblem
{
public:
  int calculateMyProblem();
private:
  double _uniformRandNum;
  std::mt19937 _generator(1729);   // for 1729 I get ERROR: Expected a type specifier
  std::uniform_real_distribution<> _distribution(0,1); // for both 0 an 1 i get ERROR: Expected a type specifier
  void generateUniformDistrNum();
  void calculateMeanDistance(); 
};

对于这两行,我得到错误

error C2059: syntax error : 'constant'
error C2059: syntax error : 'constant'

B) MyProblem.cpp

MyProblem::MyProblem()
{}
int MyProblem::calculateMyProblem()
{
  generateUniformDistrNum();
  // other stuff to be done with random number _uniformRandNum
}
void MyProblem::generateUniformDistrNum() 
{
    _uniformRandNum = (double) _distribution(_generator); // ERROR, see below
}

生成的错误如下:

error C3867: 'MyProblem::_generator': function call missing argument list; use '&MyProblem::_generator' to create a pointer to member
error C2660: 'MyProblem::_distribution' : function does not take 1 arguments

我试了一整天都没弄明白。我该如何解决这些问题?

当您使用c++ 11的非静态数据成员初始化器来初始化类定义中的数据成员时,必须使用大括号(或相等)来进行初始化。如果将这两行修改为

,代码将是正确的。
std::mt19937 _generator{1729};
std::uniform_real_distribution<> _distribution{0,1};

现场演示

然而,这仍然不能在VS2010上工作(我认为你需要VS2013才能工作)。所以你唯一的选择就是在构造函数的初始化列表中执行初始化。

MyProblem::MyProblem()
: _generator(1729)
, _distribution(0,1)
{}

不能使用()在类主体中初始化成员(非静态或const成员)。您需要在构造函数初始化列表中或在构造函数的主体中(或在一个源文件中的类定义之外,如静态成员)执行此操作:

头文件:

class MyProblem
{
public:
  int calculateMyProblem();
private:
  double _uniformRandNum;
  std::mt19937 _generator;
  std::uniform_real_distribution<> _distribution;
  void generateUniformDistrNum();
  void calculateMeanDistance(); 
};
源文件:

MyProblem::MyProblem() : _generator( 1729), _distribution( 0, 1) {}
//... the rest of function defs

在c++ 11中,你可以使用{}来初始化类主体中的成员:

class MyProblem {
    //...
    std::mt19937 _generator{1729};
    std::uniform_real_distribution<> _distribution{0,1};
    //...
}

最新更新