【问题标题】:C++ - Boost : Getting same random number . Seeding does not seem to workC++ - Boost:获得相同的随机数。播种似乎不起作用
【发布时间】:2016-11-27 15:33:24
【问题描述】:

我创建了一个类MyRandom来在均匀分布上掷骰子,给定范围作为输入:

MyRandom.cpp

#include "MyRandom.h"

MyRandom::MyRandom(){
    gen.seed(static_cast<unsigned int>(std::time(0)));
}


int MyRandom::die(int min, int max){

    boost::uniform_int<> dist(min, max);
    boost::variate_generator<boost::mt19937&, boost::uniform_int<> > role(gen, dist);
    int result = role();
    role.engine().seed();
    role.distribution().reset();
    return result;
}

ma​​in.cpp

std::cout <<  myRandom.die(0, 8) << std::endl; 
std::cout <<  myRandom.die(0, 8) << std::endl;
std::cout <<  myRandom.die(0, 8) << std::endl;
std::cout <<  myRandom.die(0, 8) << std::endl;
std::cout <<  myRandom.die(0, 8) << std::endl;
std::cout <<  myRandom.die(0, 8) << std::endl;
std::cout <<  myRandom.die(0, 8) << std::endl;

我一直得到相同的数字(除了第一个,所以我的重置有点工作)。显然,我没有正确播种。我尝试按照建议的here 添加reset(),但没有成功。我错过了什么?

【问题讨论】:

  • 只播种一次,而不是每次生成随机数时。
  • 成功了。我误解了链接答案的答案。它解决了我连续调用的问题,但不是完整的问题,我需要编辑我的问题。
  • 其实我想通了。我通过值而不是通过引用传递了一个对象 MyRandom myRandom = MyRandom(),这导致滚动系列是相同的,因为它是生成器的副本,具有相同的种子:)

标签: c++ boost random


【解决方案1】:

出错的通常是这样的:

std::generate_n(out_iterator, 10, my_random);

这会复制带有状态的 my_random 对象。 lambda 也会发生同样的事情:

MyRandom my_random;
std::generate_n(out_iterator, 10, [=] { return my_random.die(0,8); });

你想要的是通过引用传递引擎,要么做

std::generate_n(out_iterator, 10, std::ref(my_random));

MyRandom my_random;
std::generate_n(out_iterator, 10, [&my_random] { return my_random.die(0,8); });

【讨论】:

  • 是的,我的播种是错误的,我通过值而不是参考传递它,(在提供的小样本中没有显示 - 我应该编辑它吗?)因此我滚动了相同系列的卷因为我基本上会从相同的复制随机骰子开始。
  • 你当然可以编辑它。这样,它可能对其他试图从您的问题中识别他们的问题的人更有用:)
猜你喜欢
  • 2014-06-28
  • 2015-05-10
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 2011-09-19
  • 2018-07-21
  • 2023-03-15
相关资源
最近更新 更多