【问题标题】:Boost random numbers - weird compilation error提升随机数 - 奇怪的编译错误
【发布时间】:2011-03-10 14:41:44
【问题描述】:

在我正在编写的模拟中,我有一个代表必须采取一些行动的代理的类,并且我希望该代理能够访问随机数生成器。我听说 boost rng 的 where 不错,所以我想学习如何使用它们。

所以,这就是问题所在。这段代码完美编译并运行:

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

【问题讨论】:

    标签: c++ boost random boost-random


    【解决方案1】:

    我认为您需要在构造函数初始化列表中初始化成员变量 uniuniRng,而不是在声明它们的位置内联。

    【讨论】:

      【解决方案2】:

      这两行:

      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)));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-22
        • 2016-01-23
        • 2010-10-07
        • 1970-01-01
        相关资源
        最近更新 更多