我试图使用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值?
答案 0 :(得分:0)
这是因为从double
到int
的截断。您的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。