我正在运行'Foo'对象的模拟。每个Foo必须有一个随机的“类型”t。我想通过(静态)成员函数将随机数生成封装到类中:
#include <boost/random.hpp>
class Foo {
public:
static void set_seed(int seed);
Foo();
void print() { std::cout << t << std::endl; };
private:
double t;
static boost::mt19937 rng;
static boost::uniform_01<> unif;
static boost::variate_generator<boost::mt19937, boost::uniform_01<> > type;
};
Foo::Foo() {
// create a new friend with random parameters
double t = type();
};
void Foo::set_seed(int seed) {
rng = boost::mt19937(seed);
}
boost::mt19937 Foo::rng; //reserve storage
// boost::uniform_01<> Foo::unif = boost::uniform_01<>(); // apparently not necessary
boost::variate_generator<boost::mt19937, boost::uniform_01<> > Foo::type(rng, unif); // initialize
int main() {
Foo::set_seed(1);
Foo f;
f.print();
Foo g;
g.print();
return 0;
}
代码在RHEL 6.7上编译(由g++ -I/usr/include/boost148/ test.cpp
编译),但结果看起来不像统一(0,1)randoms。 (比如6.95301e-310和0。)
任何人都可以告诉我:
我也会在C ++ 11中保持清醒,因为代码必须在一个软件上运行的软件不是最新的。
答案 0 :(得分:3)
这是破碎的:
Foo::Foo() {
// create a new friend with random parameters
double t = type();
};
你想:
Foo::Foo() {
// create a new friend with random parameters
t = type();
}
你拥有它的方式,你是&#34;阴影&#34; t
带有一个全新的变量,其生命周期只是构造函数的变量。你离开了真实的&#34;课程中t
未初始化。
Even better would be to use an initialization list:
Foo::Foo()
: t(type())
{
}