如何在VS 2010中生成统一的分布式随机数?

时间:2014-06-16 18:49:27

标签: c++ visual-studio-2010 random

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

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

尝试了这两个链接的许多组合,但我无法找到满足我需求的解决方案。 我目前的代码是:

A)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

我正在努力一整天,现在我无法弄明白。我该如何解决这些问题?

2 个答案:

答案 0 :(得分:3)

您不能使用()在类体中初始化成员(非静态或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};
    //...
}

答案 1 :(得分:3)

当您使用C ++ 11的非静态数据成员初始值设定项初始化类定义中的数据成员时,必须使用大括号(或等于)进行初始化。如果将两条违规行更改为

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

Live demo

然而,这仍然不适用于VS2010(我认为你需要VS2013才能工作)。因此,您使用该编译器的唯一选择是在构造函数的初始化列表中执行初始化。

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