【发布时间】:2014-10-03 16:51:10
【问题描述】:
我目前正在 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 随机数生成器显示出在旧的随机数生成系统中发现的典型模式。
上面使用的方法依赖于当前时间作为数字生成器的种子。有没有办法改进种子,使随机序列不太容易出现模式?如果有任何帮助,我将不胜感激。
【问题讨论】:
-
有什么理由不使用
<random>吗?它更加强大。 -
它似乎也遇到了同样的模式问题——在足够大的样本量下几乎可以预测。
-
每个 PRNG 都可以通过“足够大”的样本量进行预测。但是对于好的算法来说,“足够大”是不可能的。你有没有看过可用的? cplusplus.com/reference/random
-
这个特殊的应用程序是对进化过程的模拟,因此输入越随机,性能就会越好。您提到的随机数生成器非常棒-但这就是问题所在,它们太好了。生成的随机序列都分布得太均匀,没有任何用处。所需要的是能够生成真正随机序列的系统。唯一接近这一点的是硬件随机数生成器。到目前为止,我发现的最好的是我的问题中的 Qt,使用时钟作为种子。
-
没有“太好”的RNG。 Mersenne Twister 将为您提供具有(几乎)相同概率的任何数字序列。甚至是 0 - 0 - 0 - 0 - 0 之类的序列
标签: c++ qt random seeding qt5.3