Увеличение случайных чисел - странная ошибка компиляции - PullRequest
1 голос
/ 10 марта 2011

В симуляции, которую я пишу, у меня есть класс, представляющий агента, который должен выполнить некоторые действия, и я хочу, чтобы этот агент имел доступ к генератору случайных чисел. Я слышал, что RGB там хорошие, и я хотел научиться их использовать.

Итак, вот проблема. Этот код компилируется и отлично работает:

//Random.cpp
#include <boost/random.hpp>      
#include <boost/limits.hpp>
#include <iostream>
#include <ctime>         


int main()
{
  int N = 10;
  boost::lagged_fibonacci607 rng;
  rng.seed(static_cast<boost::uint32_t> (std::time(0)));
  boost::uniform_real<> uni(0.0,1.0);
  boost::variate_generator<boost::lagged_fibonacci607&, boost::uniform_real<> >   uniRng(rng, uni);

  for (int i = 0; i < N; ++i)
      std::cout << uniRng() << std::endl;

  return 0;

}

Итак, я хотел, чтобы у моего класса Agent был доступ к закрытому объекту типа:

boost::variate_generator<boost::lagged_fibonacci607&, boost::uniform_real<> > 

, который можно вызвать, когда агенту нужно случайное число.

Итак, что я пытался сделать, это:

//RandomAgent.cpp    
#include <boost/random.hpp>      
#include <boost/limits.hpp>
#include <iostream>
#include <ctime>         

class Agent {
private:
  boost::lagged_fibonacci607 rng;
  boost::uniform_real<> uni(0.0,1.0);
  boost::variate_generator<boost::lagged_fibonacci607&, boost::uniform_real<> >   uniRng(rng, uni);

public:
  Agent() {
    rng.seed(static_cast<boost::uint32_t> (std::time(0)));
  }
  void show() {
    std::cout << uniRng() << std::endl;
  }
};


int main() {
  Agent foo;
  for(int i = 0; i < 10; ++i) 
    foo.show()
}

И я получил следующие сообщения об ошибках:

$ g++ RandomAgent.cpp
Random.cpp:10: error: expected identifier before numeric constant
Random.cpp:10: error: expected ‘,’ or ‘...’ before numeric constant
Random.cpp:11: error: ‘rng’ is not a type
Random.cpp:11: error: ‘uni’ is not a type
Random.cpp: In member function ‘void Agent::show()’:
Random.cpp:18: error: no matching function for call to ‘Agent::uniRng()’
Random.cpp:11: note: candidates are: boost::variate_generator<boost::lagged_fibonacci607&, boost::uniform_real

> Агент :: uniRng (int, int)

Ответы [ 2 ]

3 голосов
/ 10 марта 2011

Думаю, вам нужно инициализировать переменные-члены uni и uniRng в списке инициализации конструктора, а не в строке, где они объявлены.

2 голосов
/ 10 марта 2011

Эти две строки:

boost::uniform_real<> uni(0.0,1.0);
boost::variate_generator<boost::lagged_fibonacci607&, boost::uniform_real<> >   uniRng(rng, uni);

должны быть

boost::uniform_real<> uni;
boost::variate_generator<boost::lagged_fibonacci607&, boost::uniform_real<> > uniRng;

, и эти две переменные должны быть инициализированы в конструкторе как

Agent() 
    : uni(0., 1.), uniRng(rng, uni) 
{
    rng.seed(static_cast<boost::uint32_t> (std::time(0)));
}
...