C++ - Boost : Getting same random number . 播种似乎不起作用

标签 c++ boost random

我创建了一个类 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;
}

main.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;

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

最佳答案

通常出错的地方是这样的:

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

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

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

关于C++ - Boost : Getting same random number . 播种似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38548313/

相关文章:

c++ - boost asio transfer_exactly 读取 0 字节

python - 从两列随机生成唯一组合

c# - 具有 10 个元素的随机 boolean 数组,其中 10 个元素中有 3 个为真

c++ - 快速安全地确定范围内的随机数

java - 对于包含名为 "Node"的类的 JNI C++ 代码,JVM 无法按预期工作

c++ - 如何在 OS X 上获得准确的堆栈基地址?

c++ - QT 上传(PUT)文件

c++ - 在 glTexImage3D 和 glTexStorage3D 之间切换

c++ - 在 boost::d_ary_heap_indirect 中更新优先级

c++/boost program_options 一个选项禁用其他