2

我目前正在 Qt5.3 中实现一个随机数生成器,作为遗传算法实验的一部分。我尝试了几种方法,但最好的方法似乎是:

  // Seed the random generator with current time
  QTime time = QTime::currentTime();
  qsrand((uint)time.msec());

然后这个函数生成随机数:

int MainWindow::getRandomNo(int low, int high)
{
    return qrand() % ((high + 1) - low) + low;
}

由于这些实验的性质,这些数字的随机性很重要。有没有办法提高随机数样本的质量?经过统计分析,Qt 随机数生成器展示了在较旧的随机数生成系统中发现的典型模式。

上面使用的方法依赖于当前时间作为数字生成器的种子。有没有办法改进种子,使随机序列不太容易出现模式?我将非常感谢任何帮助。

4

3 回答 3

2

使用MT

你可以在这里得到一个实现:

几年前我在一个 delphi 软件中遇到了同样的问题,然后切换到 MT 解决了我的问题。但请查看 boost 文档中的列表,以获取有关 RNG 算法之间差异的更多详细信息。

于 2014-10-04T08:20:15.400 回答
1

调整种子不会真正影响生成数字的质量,只会影响生成数字的特定顺序。您将需要使用更好的算法来生成随机数。

此外,您使用生成数字的方式略有偏差。使用您的 getRandomNo 函数,会稍微偏向较小的数字。例如,如果qrand返回 range 中的值0..2^32-1,并且您有low=0and high=2^32-2,那么照常使用%将意味着0返回的频率(大约)是任何其他数字的两倍。

一个改进是尝试这样的事情:

n是一个正整数,其中你想要一个 0..n-1 范围内的随机整数,让m2 的最小幂大于或等于n

unsigned int myrand( unsigned int n, unsigned int m )
{
    unsigned int i = qrand() % m; /* or (qrand() & (m-1)) */
    while ( i >= n )
    {
        i = qrand() % m;
    }

    return i;
}

这会更慢,但预期的迭代次数是 2。此外,如果您多次使用相同的范围,您可以预先计算m.

于 2014-10-03T17:26:44.717 回答
1

dohashi答案的修改可以是取m大于或等于的第一个素数n

于 2015-01-04T12:43:26.587 回答