在类中增加随机数作为静态成员

时间:2015-12-19 05:14:19

标签: c++ boost random static-members

我正在运行'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。)

任何人都可以告诉我:

  1. 这是MC模拟的合理方法吗?我必须并行创建大量的Foos,但并行化是在更高级别(在R中)完成的,其中每个MPI工作者将加载相应的编译代码(在共享和非共享内存cpus上)。我认为静态成员在这个意义上是'mpi-parallel-safe',但告诉我我是不是错了。
  2. 如何才能使随机数初始化正确?
  3. 我也会在C ++ 11中保持清醒,因为代码必须在一个软件上运行的软件不是最新的。

1 个答案:

答案 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())
{
}