我正在尝试使用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,我很确定它会在调用它的函数超出范围之后超出范围。我试过玩静态和外部,我已经尝试过滚动部分类,所以它不会超出范围,但似乎没有任何效果。
答案 0 :(得分:1)
如何在.h文件中声明seed
和rool
函数,以及它们在.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;
}