Boost库RNG输出在存储在对象中时行为奇怪
Boost library RNG output behaving strangely when stored in an object
我试图使用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能够被存储为y的x值?
这是因为从double
到int
的截断。您的set_x
以int
为参数,但您传递的是均匀分布在[0,1)
中的double
,因此参数转换为0
。
看起来您正在向构造函数传递一个双精度类型,但是Set函数接受int类型:
Thingy(double x){set_x(x);}
void set_x(int x){ this->x = x; }//Sure you want to take an int in parameter here?
这可能会导致您不想要的转换。
因为x总是在[0,1]的范围内,所以双精度型总是变成int 0
同样值得一提的是,如果您有c++11可用,您可能能够消除对boost的依赖。更多信息请参见http://en.cppreference.com/w/cpp/numeric/random
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- Boost库RNG输出在存储在对象中时行为奇怪