提升C++:在函数中播种随机数

Boost C++: Seeding random numbers in a function

本文关键字:随机数 函数 C++ 提升      更新时间:2023-10-16

我有一个函数,每次调用一个新的随机指数变量时都应该模拟它:

 #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();
}

一般来说,随机数的来源应该是一个资源,其生命周期是整个程序的生命周期,而不是单个函数调用的生命周期。

因此,您需要表示所述随机数源的对象具有适当的生命周期。让它成为函数的局部变量是一个坏主意。它应该是传递到函数中的对象,或者可能是全局对象。

(此外,经常重新设定随机数生成器种子是另一个众所周知的坏主意)