我这里有个奇怪的问题,我找不到一个很好的解释,所以我想问你们:
考虑以下方法:
int MathUtility::randomize(int Min, int Max)
{
qsrand(QTime::currentTime().msec());
if (Min > Max)
{
int Temp = Min;
Min = Max;
Max = Temp;
}
return ((rand()%(Max-Min+1))+Min);
}我不会解释这个方法到底做了什么,而是解释我的问题:
我意识到当我在循环中调用这个方法时,有时是,我一次又一次地得到相同的随机数.例如,这个片段..。
for(int i=0; i<10; ++i)
{
int Index = MathUtility::randomize(0, 1000);
qDebug() << Index;
}...will产生的结果如下:
567...etc.
我也意识到,如果我不每次打电话给qsrand,但在我的应用程序生命周期中只打一次电话,它就会运行得非常好.
我的问题:为什么?
发布于 2010-05-04 17:13:23
因为如果您在毫秒内多次调用randomize (在当前的CPU时钟速度下很可能如此),那么您将以相同的值播种RNG。这可以保证从RNG中产生相同的输出。
随机数发生器只能被播种一次。多次播种不会使输出产生额外的随机性,实际上(正如您所发现的)可能会使输出的随机性大大降低。
发布于 2010-05-04 17:14:59
如果调用足够快,QTime::currentTime().msec()的值就不会改变,基本上是用相同的种子重新播种qsrand,导致生成的下一个随机数与前面的随机数相同。
发布于 2012-02-14 08:34:26
如果您调用qsrand Qt函数来初始化种子,则必须调用qrand Qt函数来生成随机数,而不是从标准库中生成rand函数。rand函数的种子初始化是srand。很抱歉挖出来了。
https://stackoverflow.com/questions/2767383
复制相似问题