Boost库RNG输出在存储在对象中时行为奇怪

Boost library RNG output behaving strangely when stored in an object

本文关键字:对象 RNG 输出 存储 Boost      更新时间:2023-10-16

我试图使用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值?

这是因为从doubleint的截断。您的set_xint为参数,但您传递的是均匀分布在[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