相关函数 #include <QtGlobal>
qsrand(unsigned seed);
qrand();
以上函数产生的随机数为伪随机数。之所以称为伪随机数,有以下两点原因:
1:qsrand用来设置一个种子,该种子为qrand生成随机数的起始值。比如说qsrand(10),设置10为种子,那么qrand生成的随机数就在[10,32767]之间
(RAND_MAX == 32767)。如果在qrand()前没有调用过qsrand(),那么qrand()就会自动调用qsrand(1),即系统默认将1作为随机数的起始值。
2:之所以称为伪随机数,因为种子的值相同的情况下,函数运行两次产生的随机序列一致。
注意:qrand()函数产生的是一个随机序列,只不过每次只返回一个值。举例如下:
#include <QTime> #include <QtGlobal> #include <QDebug> void generateAscendRandomNumber() { int i; QList<int> numbersList; qsrand(10); for(i=0;i<10;i++) { numbersList.append(qrand()%10); } qSort(numbersList.begin(),numbersList.end()); for(i=0;i<10;i++) { qDebug()<<numbersList[i]; } } int main() { generateAscendRandomNumber() ; }
以上输出为:1 2 2 2 4 6 6 7 9(实际会换行)
多次运行程序发现输出结果是一致的。因为种子不变的情况下,qrand()运行多次产生的随机序列一致。
结论:种子相同,每一个随机序列内的每一个数都是随机的,但是随机序列之间却不是随机的。
为了获得不同的随机序列,可以使用当前时间作为种子,来进行模拟随机数。因为时间是不断变化的,即种子的值也是不同的,所以产生的随机序列也是不同的。
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()))
int QTime::secsTo ( const QTime & t ) const
函数返回这个时间到t的秒数(如果t早于这个时间,返回的为负数)。因为QTime只能度量一天之内的时间,而且一天内只有86400秒,
所以结果就应该在-86400秒和86400秒之间。
实际上QTime(0,0,0).secsTo(QTime::currentTime())
返回的值就是从0到QTime::currentTime()
的值。