随机数生成和封装

时间:2012-08-12 17:00:54

标签: c++ boost encapsulation

我正在尝试使用boost生成随机数,但是我无法让它以一种保持所有内容封装的方式工作。我在main()中有这段代码,它允许我使用roll()从[0,1)生成一个随机数

boost::mt19937 rng(seed);
boost::uniform_01<> uniform_p;
boost::variate_generator< boost::mt19937, boost::uniform_01<> >
    roll(rng, uniform_p);

现在我想将它粘贴在自己的header / cpp文件中,其中一个函数用于获取种子并创建roll,另一个函数用于调用roll。但似乎没有任何东西可以看到roll,我很确定它会在调用它的函数超出范围之后超出范围。我试过玩静态和外部,我已经尝试过滚动部分类,所以它不会超出范围,但似乎没有任何效果。

2 个答案:

答案 0 :(得分:1)

如何在.h文件中声明seedrool函数,以及它们在.cpp文件中的实现。您可以使用static scoped_ptr来存储辅助对象i .cpp模块,并在静态初始化阶段后对其进行初始化。线程安全是此解决方案中要记住的另一件事。

答案 1 :(得分:0)

以下是类似Matlab的界面,我喜欢用它来生成随机数。您必须在使用seed()之前致电rand()。正如Greg指出的那样,scoped_ptr可以很方便地存储所需的静态变量(Mersenne twister和variate generator)。对于线程安全,请使用互斥锁保护这些资源。

<强> random.hpp

#ifndef RANDOM_HPP
#define RANDOM_HPP

void seed(unsigned s);
double rand();

#endif // RANDOM_HPP

<强> random.cpp

#include "random.hpp"
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_01.hpp>
#include <boost/random/variate_generator.hpp>
#include <boost/scoped_ptr.hpp>

static boost::scoped_ptr<boost::mt19937> twister;
static boost::scoped_ptr<boost::variate_generator<boost::mt19937&,
                                                  boost::uniform_01<> > > vargen;

void seed(unsigned s)
{
    twister.reset(new boost::mt19937(s));
    vargen.reset(new boost::variate_generator<boost::mt19937&,
                                              boost::uniform_01<> >(
                     *twister, boost::uniform_01<>()));
}

double rand()
{
    assert(vargen.get() != 0);
    return (*vargen)();
}

<强>的main.cpp

#include "random.hpp"
#include <iostream>

int main()
{
    seed(42);
    for (int i = 0; i < 10; ++i)
        std::cout << rand() << std::endl;
    return 0;
}