增强随机发电机返回相同的值

Boost Random Generators returning identical values

本文关键字:返回 随机 发电机 增强      更新时间:2023-10-16

不使用C 11 Random

寻找助推随机专家...我需要在许多不同范围之间生成随机数。我写了以下功能:

#include <iostream>
#include <boost/random.hpp>
#include <boost/generator_iterator.hpp>
boost::mt19937 g_oRng;
int generateIntVariate(int p_iMin, int p_iMax){
  boost::uniform_int<> min_to_max(p_iMin, p_iMax);
  boost::variate_generator< boost::mt19937, boost::uniform_int<> > oGen(g_oRng, min_to_max);
  return oGen();
}
float generateFloatVariate(int p_fMin, p_fMax){
  boost::uniform_real<> min_to_max(p_fMin, p_fMax);
  boost::variate_generator< boost::mt19937, boost::uniform_real<> > oGen(m_oRng, min_to_max);
  return oGen();
}

int main(){
  struct timeval tp;
  gettimeofday(&tp, NULL);
  g_oRng = boost::mt19937((int)tp.tv_sec);

  for(int i = 0 ; i < 10 ; ++i){
    std::cout << generateIntVariate(0, 10) << ", " << generateFloatVariate(0.0f, 10.0f) << std::endl;
  }
}

问题在于,这两个函数在执行时返回给定范围的相同的确切数字。

(gdb) p generateIntVariate(0, 10)
$40 = 8
(gdb) p generateIntVariate(0, 10)
$41 = 8
(gdb) p generateIntVariate(0, 10)
$42 = 8
(gdb) p generateIntVariate(0, 10)
$43 = 8

与上述相同的事情发生在浮点功能中。有什么办法可以完成使用Boost Random Distro的尝试做的事情?

boost::variate_generator的构造函数看起来像这样:

variate_generator(Engine e, Distribution d);

- 意味着它不会改变传递的m_oRng的状态,而是将其复制。

我建议省略variate_generator并仅使用boost::uniform_int<>::operator()