在我正在编写的模拟中,我有一个代表必须采取某些操作的代理的类,我希望这个代理可以访问随机数生成器。我听说有很好的提升,所以我想学习如何使用它们。
所以,这就是问题所在。此代码编译并运行完美:
//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
&gt; Agent :: uniRng(int,int)
答案 0 :(得分:3)
我认为你需要在构造函数初始化列表中初始化成员变量uni
和uniRng
,而不是内联它们的内联。
答案 1 :(得分: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)));
}