相關函數 #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()
的值。