存储在对象中时,Boost库RNG输出表现异常

时间:2015-05-22 17:18:23

标签: c++ object boost double

我试图使用boost库生成随机数。首先,我使用boost库来创建这个非常简单的类:

#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_01.hpp>

class TimeRNG01 {

private:
    boost::random::mt19937 rng;
    boost::random::uniform_01<double> roll;
public:
    TimeRNG01(){
        unsigned int t = static_cast<unsigned int>(time(0));
        rng.seed(t);
    }

    double num(){return roll(rng);}
};

然后我让这个更简单的类在一个对象中测试它:

class Thingy {
private:
    double x;
public:
    Thingy(double x){set_x(x);}
    void set_x(int x){ this->x = x; }
    double get_x(){return x;}
};

在我的主要方法中,我得到了一些奇怪的结果,所以我尝试了一些东西来调试它。首先,我定义了一个名为trng的TimeRNG01对象。然后我写道:

double q = trng.num();
cout << q << endl;

打印0到1之间的随机数,与预期完全一致。但是当我接下来试图将那个q存储在Thingy中时,我得到了一些奇怪的东西:

Thingy t(q);
cout << t.get_x() << endl;

这始终打印0,而不是随机数,这是意外的。为了确保我没有对Thingy课程做错任何事情,我尝试了这个:

double f = 1;
Thingy r(f);
cout << r.get_x() << endl;

打印1,与预期完全一样。

因此,出于某种原因,似乎这个随机数生成器的输出不被视为普通的双精度,并且不能正确地存储在对象中。我怎样才能纠正这个问题,以便q能够存储为Thingy的x值?

2 个答案:

答案 0 :(得分:0)

这是因为从doubleint的截断。您的set_x以[{1}}为参数,但您传递的int均匀分布在double中,因此参数转换为[0,1)

答案 1 :(得分:0)

看起来你正在将一个double传递给构造函数但是 set函数采用int:

0

这可能会导致您不想要的转换。

因为x始终在[0,1]范围内,所以double始终为int 0。

另外值得一提的是,如果你有c ++ 11可用,你可能可以删除你对boost的依赖。有关详细信息,请参阅http://en.cppreference.com/w/cpp/numeric/random