【问题标题】:Boost Random Generators returning identical valuesBoost Random Generators 返回相同的值
【发布时间】:2017-06-27 18:59:16
【问题描述】:

不使用 C++ 11 随机

正在寻找提升随机数专家...我需要生成许多不同范围之间的随机数。我编写了以下函数:

#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

float 函数会发生与上述相同的事情。有什么方法可以使用 boost random 发行版完成我想做的事情吗?

【问题讨论】:

  • plus1 对抗匿名 neg1
  • 你能给我们一个minimal reproducible example吗?从一开始我就看到你没有播种 PRNG,所以你总是会得到相同的序列。
  • @NathanOliver 实际上我是,只是这里没有显示。我用 gettimeofday 的 tv_sec 播种
  • 注意这里不用boost,C++的随机函数基本一样
  • @Riptyde4 还在等你修复boost:mt19937中缺少的参数类型和缺少的:。你为什么要这样做?

标签: c++ random boost c++98


【解决方案1】:

boost::variate_generator 的构造函数如下所示:

variate_generator(Engine e, Distribution d);

- 表示它不会改变传入的m_oRng 的状态,而是复制它。

我建议省略variate_generator,只使用boost::uniform_int&lt;&gt;::operator()

【讨论】:

    猜你喜欢
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 2010-12-23
    • 2016-01-24
    • 1970-01-01
    相关资源
    最近更新 更多