0

我正在尝试使用 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);

现在我想将它粘贴在它自己的头文件/cpp 文件中,其中一个函数用于获取种子并创建卷,而其他函数则调用卷。但是似乎什么都看不到滚动,而且我很确定它会在调用它的函数超出范围后超出范围。我尝试过使用静态和外部,我尝试过让 roll 成为类的一部分,这样它就不会超出范围,但似乎没有任何效果。

4

2 回答 2

1

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

于 2012-08-12T17:28:31.173 回答
0

下面是一个类似于 Matlab 的接口,我喜欢用它来生成随机数。seed()使用前必须先打电话rand()。正如 Greg 指出的那样,scoped_ptr存储所需的静态变量(Mersenne twister 和变量生成器)很方便。为了线程安全,请使用互斥锁保护这些资源。

随机的.hpp

#ifndef RANDOM_HPP
#define RANDOM_HPP

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

#endif // RANDOM_HPP

随机的.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)();
}

主文件

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

int main()
{
    seed(42);
    for (int i = 0; i < 10; ++i)
        std::cout << rand() << std::endl;
    return 0;
}
于 2012-08-12T18:57:54.080 回答