【问题标题】:Boost C++: Seeding random numbers in a functionBoost C++:在函数中播种随机数
【发布时间】:2015-05-10 05:45:28
【问题描述】:

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

 #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))”可能会修复它,但它没有。我怎样才能让它做到这一点?

【问题讨论】:

  • 每次你调用它时,你都会一直喂它种子。因此,每次调用它时,它都会生成相同的值。 time(0) 在时钟周期之间不会经常变化。
  • 请注意,mt19937 已添加到 C++11;如果你有 C++11 可用,那么你可以改进这个功能

标签: c++ boost seed


【解决方案1】:

如果您无法更改函数的签名,那么您可以使用生成器的 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();
}

【讨论】:

  • 谢谢!这行得通。只是想知道,既然我们将 rng 设为静态,那么在函数外部定义它是否也一样?
  • 是的,那么它将是一个全球性的。正如其他人所提到的,您还可以将生成器的实例作为参数传递给函数。
  • 如果您在程序的其他地方也使用了随机数生成器,我会相当怀疑这种方法。
【解决方案2】:

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

因此,您需要表示所述随机数源的对象具有适当的寿命。将其作为函数的本地变量是一个坏主意。它应该是传递给您的函数的对象,或者可能是全局对象。

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

【讨论】:

  • 谢谢!所以你认为我应该做“boost::mt1937 rng;”吗?在main()函数中,在main函数中指定rng.seed(time(0)),剩下的行留给generateExponential函数?
猜你喜欢
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 2014-03-24
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
相关资源
最近更新 更多