C++ C++;-Boost:获得相同的随机数。播种似乎不起作用

C++ C++;-Boost:获得相同的随机数。播种似乎不起作用,c++,boost,random,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);

我创建了一个类
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;
}
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;
#包括“MyRandom.h”
MyRandom::MyRandom(){
gen.seed(静态(标准时间:0));
}
int MyRandom::die(int最小值,int最大值){
均匀分布(最小值、最大值);
boost::变量_生成器角色(gen、dist);
int result=role();
role.engine().seed();
role.distribution().reset();
返回结果;
}
main.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;
}
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;

std::cout常见的错误是这样的:

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


通常出错的情况如下:

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 MyRandom=MyRandom(),这会导致滚动序列相同,因为它是生成器的副本,具有相同的种子:)仅种子一次,而不是每次生成随机数时。它起作用了。我误解了链接答案中的答案。它解决了我连续打电话的问题,但不是完全的问题,我需要编辑我的问题。实际上我已经解决了。我通过值而不是引用传递对象MyRandom MyRandom=MyRandom(),这导致滚动序列相同,因为它是生成器的副本,具有相同的种子:)是的,我的种子设定错误,我通过值而不是引用传递它(在提供的小示例中没有显示-我应该编辑它吗?)因此,我滚动相同系列的骰子,因为我基本上是从相同的复制随机骰子开始的。当然,你可以编辑它。这样,对于试图从您的问题中认识到他们的问题的其他人来说,它可能更有用:)是的,我的种子设定错误,我是通过值而不是引用传递它的(这在提供的小样本中没有显示-我应该编辑它吗?)因此,我滚动相同系列的骰子,因为我基本上是从相同的复制随机骰子开始的。当然,你可以编辑它。这样,对于试图从您的问题中认识到自己问题的其他人来说可能更有用:)