隨機數種子與隨機數

2021-05-22 12:23:10 字數 1177 閱讀 4941

本文要討論的內容就是,在c語言中,是如何取得這個隨機數的?  

乙個語句:rand();  

它的作用就是隨機取0到rand_max之間的任何數。ansi標準指出,rand_max值的範圍到少是32767,也就是雙位元組整數的最大值。  

下面我們用乙個例子來取得從1到6的隨機整數:  

#include  

#include  

main()  

第2行的stdlib.h是rand()函式的標頭檔案,第7行就是   實現功能的語句了。前面我們以經說過函式取的值是介於0到randmax之前的,而我們所要的是1到6之間的整數。用腳想一想就知道:任一整數除以6所得的餘數是0~5之間的整數,再加一之後就是1到6了,也就是我們的目標。利用這個原理我們使用%號對隨機數進行了縮放。  

ok,執行兩次程式:  

一:6   6   5   5   6   5   1   1   5   3   6   6   2   4   2   6   2   3   4   1    

二:6   6   5   5   6   5   1   1   5   3   6   6   2   4   2   6   2   3   4   1  

發現:兩次執行的結果完全一樣。  

結論:這算什麼隨機數。  

具有諷刺意味的是,這種重複性是rand的乙個重要特點,在除錯程式時,這種重複性是必不可少的,因為它可以證明對程式的修改能夠正常執行。  

實際上,rand函式產生的是偽隨機數。但我們需要的是隨機數。於是,我們需要對程式進行隨機化,這需要使用標準庫函式srand來實現。函式srand需要乙個無符號的整型引數,在每次程式執行時用函式rand去生在一組不同的隨機數。如下例:  

#include  

#include  

main()  

程式的執行結果是當我們輸入不同的seed時,產生不同組的隨機數。這句話的意思有兩個:一:當輸入相同的seed時,產生的同組隨機數;二:每次執行我們都要輸入乙個seed。  

如果我們希望不用每次輸入seed值,而且每次執行時seed值都是不同的,我們可以用下面語句代替上面的第三塊的三個語句:  

srand(time(null));  

這會使計算機自動讀取自己的時鐘以獲得seed值。於是我們就獲值了每次執行都會改變的seed,同樣也就獲得了真正的隨機數。  

隨機數種子

隨機數 int main 函式rand 是真正的隨機數生成器,而srand 會設定供rand 使用的隨機數種子。如果你在第一次呼叫rand 之前沒有呼叫srand 那麼系統會為你自動呼叫srand 而使用同種子相同的數呼叫 srand 會導致相同的隨機數序列被生成。srand unsigned ti...

隨機數種子

隨機數就是就隨機數種子中取出的數。種子就是個序號,這個序號交給乙個數列管理器,通過這個序號,你從管理器中取出乙個數列,這個數列就是你通過那個序號得到的隨機數。但這個隨技術並不真正隨機。因為它是通過某個演算法的得到。也就是說你給數列管理器同乙個序號將得到同樣乙個 隨機 數列。也就是說種子和隨機數列是一...

隨機數種子

隨機數 int main 函式rand 是真正的隨機數生成器,而srand 會設定供rand 使用的隨機數種子。如果你在第一次呼叫rand 之前沒有呼叫srand 那麼系統會為你自動呼叫srand 而使用同種子相同的數呼叫 srand 會導致相同的隨機數序列被生成。srand unsigned ti...