c++rand()和来自boost的RNG生成相同的数字(在发布模式中),即使srand(0)也是如此

c++ rand() and RNG from boost generating the same numbers(in release mode) even with srand(0)

本文关键字:即使 模式 srand 布模式 数字 boost RNG c++rand      更新时间:2023-10-16

我使用rand()在一个函数中生成一些随机数来填充一些数组,但当我运行该程序时,我注意到它总是给出相同行的生成数。数组中填充了同一行生成的数字,可以全部为0,也可以是一行不同的数字,但这种数字模式在每个数组中都是相同的。

所以我用debug一步一步地运行这个程序,它成功了,rand()为每个数组生成了不同的数字。。

在这之后,我决定尝试另一种方法来生成随机数。我找到了一种使用Boost库来实现这一点的方法。

这是我现在使用的代码:

int main(){
    typedef boost::mt19937 RNGType;
    RNGType rng( (unsigned int)time(NULL));
    boost::uniform_int<> one_to_six( 1, 6);
    boost::variate_generator< RNGType, boost::uniform_int<> >
    dice(rng, one_to_six);
    for(int i=0;i<10;i++){
    std::cout<<dice()<<std::endl;   
    }
}

如果我在main()函数上使用这段代码,一切都很顺利,它会给我10个随机数。但是,如果我把这个代码放在一个函数中,以便随时调用它,它会给我返回相同的数字。总是55555555或0000000。。有趣的是,如果我使用debug并在该函数上设置断点,然后一步一步地运行它,它会再次工作,给我不同的数字。所以我不知道我在这里错过了什么。。

edit:当我使用rand()时,我使用的是srand((unsigned int)time(NULL))

更新1:

    int random(int begin,int end){
    typedef boost::mt19937 RNGType;
    RNGType rng( (unsigned int)time(NULL));
    boost::uniform_int<> one_to_six( begin , end );
    boost::variate_generator< RNGType, boost::uniform_int<> >
    dice(rng, one_to_six);
    return dice();
}

int main()       {
for(int i=0; i<10; i++)
    cout<<random(0,6)<<endl;
}

如果我使用这种方法,它会给我相同的顺序。如果我通过调试一步一步地运行它,它会起作用,并给我不同的数字。

您在每个函数调用中为rng播种,因此您总是从一个种子开始获得一个随机序列(长度为1)。由于使用time(NULL)作为种子,因此一秒内的所有调用都将获得相同的种子,从而获得相同的序列。

由于您不想重复使用相同的序列,因此不应该在对random的调用之间为rng种子,而是继续上一次调用的序列,就像在完全位于main内部的版本中所做的那样。这需要您在调用之间维护生成器对象的状态,而不是每次都构造一个新对象。

找到了另一种方法,现在可以工作了。

如果有人需要,我会把代码放在这里

boost::random::mt19937 gen;
int random(int begin, int end) 
{   
    boost::random::uniform_int_distribution<> dist(begin, end);
    return dist(gen);
}
int main(){
    for(int i=0;i<10;i++) 
        std::cout << random(0,20) << std::endl;  
 }
相关文章: