Boost C++:在函数中播种随机数
Boost C++: Seeding random numbers in a function
我有一个函数,每次调用它时都应该模拟一个新的随机指数变量:
#include <boost/random.hpp>
//Simulates a single exponential random variable
double generateExponential(double lambda) {
boost::mt19937 rng; //Mersenne Twister Generator
rng.seed(time(0));
boost::variate_generator< boost::mt19937&, boost::exponential_distribution<> > rndm(rng, boost::exponenti\
al_distribution<>(lambda));
return rndm();
}
例如,
double newExp = generateExponential(10);
但是,每次我调用该函数时,它都会生成相同的 随机数。我希望它在每次调用该函数时生成一个不同的随机数。我认为 "rng.seed(time(0))" 可能会修复它,但它没有。我怎样才能做到这一点?
一般来说,随机数源应该是一种资源,其生命周期为您的整个程序,而不是单个函数调用的生命周期。
因此,您需要代表所述随机数源的对象具有适当的生命周期。使它成为函数的局部变量是一个坏主意。它应该是传递给您的函数的对象,或者可能是全局对象。
(另外,频繁重新播种随机数生成器是另一个众所周知的坏主意)
如果您不能更改函数的签名,则可以使用生成器的 static
实例。无需重新播种。
#include <boost/random.hpp>
typedef boost::mt19937 G;
typedef boost::exponential_distribution D;
double generateExponential(double lambda)
{
static G rng(std::time(0)); // initialized and seeded once
boost::variate_generator<G &, D<> > rndm(rng, D<>(lambda));
return rndm();
}
我有一个函数,每次调用它时都应该模拟一个新的随机指数变量:
#include <boost/random.hpp>
//Simulates a single exponential random variable
double generateExponential(double lambda) {
boost::mt19937 rng; //Mersenne Twister Generator
rng.seed(time(0));
boost::variate_generator< boost::mt19937&, boost::exponential_distribution<> > rndm(rng, boost::exponenti\
al_distribution<>(lambda));
return rndm();
}
例如,
double newExp = generateExponential(10);
但是,每次我调用该函数时,它都会生成相同的 随机数。我希望它在每次调用该函数时生成一个不同的随机数。我认为 "rng.seed(time(0))" 可能会修复它,但它没有。我怎样才能做到这一点?
一般来说,随机数源应该是一种资源,其生命周期为您的整个程序,而不是单个函数调用的生命周期。
因此,您需要代表所述随机数源的对象具有适当的生命周期。使它成为函数的局部变量是一个坏主意。它应该是传递给您的函数的对象,或者可能是全局对象。
(另外,频繁重新播种随机数生成器是另一个众所周知的坏主意)
如果您不能更改函数的签名,则可以使用生成器的 static
实例。无需重新播种。
#include <boost/random.hpp>
typedef boost::mt19937 G;
typedef boost::exponential_distribution D;
double generateExponential(double lambda)
{
static G rng(std::time(0)); // initialized and seeded once
boost::variate_generator<G &, D<> > rndm(rng, D<>(lambda));
return rndm();
}