隨機數rand學習

 

隨機數 srand() & rand()
2009年08月30日 星期日 上午 11:01

     想要計算機產生一個隨機數可不像我們扔色子一樣簡單,計算機執行的每一步操作,說白了就是執行一堆代碼,這些代碼是事先被安排好的,所以計算機的產生行爲是不具有隨機性和預測性的(除非有一天計算機的結構不再是現在的體系結構,而是下一代的體系),可想而知計算機所產生的隨機數都不是真正意義上的隨機數,只是僞隨機數。

     要產生一個僞隨機數,只能通過一定的算法來實現了,於是又了rand()函數,他可以產生一個僞隨機數,但是你會發現,同一個程序被執行了N次後,每一次執行所產生的隨機數都是一樣的!原因很簡單,前面說過,計算機只能通過一定的算法來達到隨機的目的,rand()函數也是,有一個“基數”來產生相應的隨機數,每一個基數“對應”一個僞隨機序列,所以如果程序每次執行時rand()函數的基數都一樣,那麼產生的僞隨機數當然就一樣了!那麼怎麼解決這個問題呢,很簡單,每次程序執行時,爲rand()函數分配不同的基數就可以了!

     於是又有了srand()函數,我們通常這樣寫:srand(unsigned(time(NULL))); 它的返回值爲從 00:00:00 GMT, January 1, 1970 到現在所持續的秒數,然後將time_t型數據轉化爲(unsigned)型在傳給srand函數,即:   srand((unsigned) time(&t)); 每次執行程序時,他的返回值肯定是不一樣的,這就達到了隨機的效果。
       還有一個小問題要注意:最好在主程序執行時,執行一次srand(unsigned(time(NULL)))就行了,原因很簡單,看個例子:
int a[100];
for(int i=0;i<100;++i)
{
       srand(unsigned(time(NULL)));
       a[i]=rand()%100;
}
執行結束後,會發現所有的a[i]是一樣的!原因就在於這段代碼總共執行不到1s,而srand()返回是以秒爲單位的,所以每次做種時種子是一樣的!於是就出現了上述狀況,故srand(unsigned(time(NULL)))只要放在程序開頭就好了。

發佈了54 篇原創文章 · 獲贊 6 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章