Как сгенерировать равномерно распределенное случайное число в VS 2010?

0

Я пытаюсь создать класс, который включает равномерное распределенное случайное число. Я использую 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

Я пытаюсь целый день, я не мог понять. Как я могу это исправить?

  • 0
    В C ++ конструктор используется для инициализации объекта и его членов.
Теги:
visual-studio-2010
random

2 ответа

3

Вы не можете инициализировать члены (которые не являются static или const) в классе body using(). Вам нужно сделать это в списке инициализации конструктора или в его теле (или вне определения класса в одном исходном файле как для статических членов:

файл заголовка:

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

Однако в С++ 11 вы можете использовать {} для инициализации членов в классе:

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

Когда вы используете инициализаторы элементов нестатического ввода С++ 11 для инициализации членов данных в определении класса, вы должны использовать фигурные скобки (или равные) для инициализации. Ваш код будет правильным, если вы измените две линии нарушения на

std::mt19937 _generator{1729};
std::uniform_real_distribution<> _distribution{0,1};

Демо-версия

Тем не менее, это все равно не будет работать на VS2010 (я думаю, вам нужно VS2013 для его работы). Поэтому ваш единственный вариант с этим компилятором - выполнить инициализацию в списке инициализаторов конструктора.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню