隨機數的產生——srand(time(0))的誤用

rand()

C語言中可以只用rand()函數來產生0~RAND_MAX之間的隨機數,其中RAND_MAX的值與平臺有關,至少爲32767,這個函數包含在stdlib.h中。

srand()

有時候便於測試,我們需要每次重新運行程序,都產生相同的隨機數,C語言提供了srand()函數來對隨機數生成器進行初始化,也叫做爲隨機數生成器設置種子,在設置相同的種子之後,調用rand()來生成的隨機數序列都是相同的。如果不進行設置,默認隨機數種子爲0,所以每次重新運行程序,都會產生相同的隨機數序列。
所以C語言生成的隨機數也稱爲僞隨機數。

srand(time(0))以當前時間爲種子

time是C語言獲取當前系統時間的函數,以秒作單位,time(0)返回當前時間自Unix標準時間戳(1970年1月1日0點0分0秒,GMT)經過了多少秒。
如果要是每次運行時產生的隨機數不同,可以以當前時間time(0)作爲隨機數種子,這樣每一次重新設置種子之後,產生的隨機數序列就不同了。

srand(time(0))的誤用

但是,因爲time(0)返回值是以秒爲單位,如果在要在一秒內產生多個隨機數序列,以time(0)做種子也不行,如下例子,兩次產生的隨機數序列是一樣的,因爲執行太快了,兩次隨機數序列都是在同一秒內產生完了,測試代碼如下:

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>

int main()
{
    srand(time(0));
    std::cout<<"first sequence:"<<std::endl;
    for (int i=0;i<5;i++)
    {
        std::cout << rand() << std::endl;
    }
    srand(time(0));
    std::cout<<"second sequence:"<<std::endl;
    for (int i=0;i<5;i++)
    {
        std::cout << rand() << std::endl;
    }
    return 0;
}

//一種輸出
first sequence:
15897   4404    12877   17526   8080
second sequence:
15897   4404    12877   17526   8080

這種情況下,可以不設置種子,或者先用rand()生成一個值作爲種子。

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