在自己的类方法中增加随机生成器

时间:2014-01-30 18:01:15

标签: c++ boost random

这是我第一次在这里发帖,所以请点赞:)

这是我的问题。

我想使用增强随机数生成器,例如在此示例中完成http://www.boost.org/doc/libs/1_46_1/libs/random/example/random_demo.cpp

这个例子在我的计算机上运行得非常好,唯一的问题是当我在我创建的类中使用它时,输出都是一样的,我不明白为什么因为它们不在示例中。该类的名称称为Edge,有两个私有成员,即A点,B点(经典示例类)。因此,您可以将“边缘”视为具有端点A和B的线段。我的目标是在此线段上绘制一个随机点。

所以当我做的时候

int main(){
    Edge test;
    for (int i=0;i<10;i++)
        std::cout << test.draw_a_double() << endl;
    return 0;
    }

它总是返回相同的数字:(

这是.h文件中的方法:

double draw_a_Point();

以下是.cpp文件中的“#includes”(我应该把它们放在.h文件中吗?假设我没有在我项目的所有文件中使用它们):

#include <ctime>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_real.hpp>
#include <boost/random/variate_generator.hpp>

typedef boost::mt19937 base_generator_type;

以下是我方法中的代码:

base_generator_type generator(42u);
generator.seed(static_cast<unsigned int>(std::time(0)));
boost::uniform_real<> uni_dist(0,1);
boost::variate_generator<base_generator_type&, boost::uniform_real<> > uni(generator, uni_dist);

double diffChosen=uni();
return diffChosen;

我不会在这里返回一个Point对象,因为主要和唯一的问题来自diffChosen总是相同的事实。

问题是否来自只有在随机数发生器的主函数中工作的事实?

谢谢

1 个答案:

答案 0 :(得分:1)

以下可能会有所帮助:

double Edge::draw_a_double(base_generator_type& generator)
{
    boost::uniform_real<> uni_dist(0,1);
    boost::variate_generator<base_generator_type&, boost::uniform_real<> > uni(generator, uni_dist);

    double diffChosen = uni();
    return diffChosen;
}

int main()
{
    base_generator_type generator(42u);
    generator.seed(static_cast<unsigned int>(std::time(0)));

    Edge test;
    for (int i = 0; i < 10; i++) {
        std::cout << test.draw_a_double(generator) << std::endl;
    }
    return 0;
}

解释您的代码失败的原因:

generator具有生成数字的内部状态。 您可以通过seed对其进行初始化。 返回一个新的随机数后,其状态会发生变化。

但您每次都会重置其状态:

generator.seed(static_cast<unsigned int>(std::time(0)));

std::time(0)改变每一秒...... 所以你得到的系列随机数的第一个数字相同。