Improving the quality of random number generation in Qt 5.3
Improving the quality of random number generation in Qt 5.3
作为遗传算法实验的一部分,我目前正在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随机数生成器表现出在较老的随机数生成系统中发现的典型模式。
上面使用的方法依赖于当前时间作为数字生成器的种子。有没有一种方法可以改进种子,使随机序列不太容易出现模式?如果有任何帮助,我将不胜感激。
使用MT.
你可以在这里得到一个实现:
- http://www.agner.org/random/
- http://de.wikipedia.org/wiki/Mersenne-Twister
- boost_random
几年前,我在一个delphi软件中遇到了同样的问题,改用MT解决了我的问题。但请查看boost文档中的列表,了解有关RNG算法之间差异的更多详细信息。
调整种子不会真正影响生成的数字的质量,只会影响生成数字的特定顺序。你需要使用更好的算法来生成你的随机数。
此外,您使用生成的数字的方式略有偏差。使用getRandomNo函数,会对较小的数字产生轻微的偏差。例如,如果qrand
返回范围为0..2^32-1
的值,并且您有low=0
和high=2^32-2
,那么使用%
将意味着0
的返回频率(大约)是任何其他数字的两倍。
一个改进是尝试这样的东西:
设n
是一个正整数,其中您想要一个在0..n-1范围内的随机整数,设m
是大于或等于n
的2的最小幂。
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
。
dohashi答案的一个修正可以是将m
作为大于或等于n
的第一个素数
相关文章:
- cuda 10.2 in Qt 5.14 ubuntu 18.04
- QPaintedTextureImage in Qt3D (Qt 5.8)
- 没有成员命名 'setRawData' in 'QwtPlotCurve' - 转换 Qt 4.7 为 Qt 5.8
- UCHAR to Qstring in QT C++
- unique_ptr in Qt project
- const char* to LPCWSTR in Qt
- No qtCreator in qt-everywhere-opensource-src-4.8.1
- Millimeter paper in Qt
- Writing SQlite Database in Qt
- <double> QList in QT with Visual Studio add in
- How to write Sqlite DataBase in Qt
- Improving the quality of random number generation in Qt 5.3
- OSGViewer in Qt's TabWidget
- zlib in Qt - QtZlib not present
- XAudio2 in Qt Creator
- 如何通过 C++in QT 监控 Linux 中的服务
- std::thread::thread(<未解析的重载函数类型>) in Qt
- Audiocallback in Qt
- Objective-C in Qt with Mavericks
- glGenFramebuffers() in Qt get 'was not declared in this scope'