QT qrand()隨機函數不隨機?

問題

在做一個qt的課程設計時,需要一個產生隨機數(四位不同數字的隨機數)的方法,查了一下資料發現很簡單調用一下qrand()方法即可。確實也能產生隨機數但是發現一個bug就是每次重啓程序發現每次產生的隨機數都是相同的。

代碼如下:

//獲取隨機數
int MainWindow::generateRandomNumber(){
    int tag[]={0,0,0,0,0,0,0,0,0,0};
    int four=0;
    int temp=10;

    while(four<1000){
        temp=qrand()%10;//隨機獲取0~9的數字
        if(tag[temp]==0){
            four+=temp;
            four*=10;
            tag[temp]=1;
        }
    }

    for (int i=0;i<10;i++) {
        qDebug()<<i<<": "<<tag[i]<<endl;
    }

    return four;
}

這是爲什麼呢?

不是說好了是隨機數嗎?
又仔細翻閱了資料發現如果我們僅僅只是調用該函數來生成隨機數,那麼每次得到的隨機數都將是相同的,這是因爲Qt生成的隨機數嚴格來說是一個“僞隨機”,它的產生是根據隨機數種子計算得到的。如果種子相同,那麼所得到的隨機數也是相同的。 在上面的代碼中由於每次的隨機數種子是一樣的導致了每次程序重啓後產生的隨機數都是相同的。

那怎麼改呢?

爲了使我們的隨機數看起來更爲“隨機”一些,我們在每次獲取隨機數之前都需要初始化一個不同的隨機數種子,這就需要用到qsrand()函數,該函數只有一個整型參數,即要設置的隨機數種子。

函數原型

void qsrand(uint seed);

int qrand();

QT生成隨機數和C語言差距不大,C語言用srand()和rand(),QT是用Qsrand()和qrand();

QT生成隨機數的格式是:

qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
qrand();

只需將上面的代碼修改即可:

//獲取隨機數
int MainWindow::generateRandomNumber(){
    int tag[]={0,0,0,0,0,0,0,0,0,0};
    int four=0;
    int temp=10;

    while(four<1000){
        //設置隨機數種子,否則每次得到的隨機數都相同使得"不隨機"
        qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
        temp=qrand()%10;//隨機獲取0~9的數字
        if(tag[temp]==0){
            four+=temp;
            four*=10;
            tag[temp]=1;
        }
    }

    for (int i=0;i<10;i++) {
        qDebug()<<i<<": "<<tag[i]<<endl;
    }

    return four;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章