哈嘍,大家好,我是北方素素~
首先給大家解釋一下這個標題,什么叫做“淺析”呢?就是稍微分析一下,哈哈。用了“淺析”就突然感覺高大上了,其實并沒有多深奧,只是以我的理解給大家解釋一下。
我們知道,在一些書籍中,使用C語言生成隨機數(shù)一般是這樣寫的:
srand(unsigned(time(NULL)));
int rand_number = rand();
這里主要涉及到了三個函數(shù),srand(),rand()和time()。
不知道這三個函數(shù)是做什么的?MSDN文檔中解釋了這三個函數(shù)的作用:
srand():Sets the starting seed value for the pseudorandom number generator(設(shè)置偽隨機數(shù)生成器的起始種子值)。
它的搭檔rand():Generates a pseudorandom number(生成一個偽隨機數(shù))。
而time()的解釋就更簡單了:Get the system time(獲得系統(tǒng)時間)。
這三個函數(shù)組合在一起,就可以生成隨機數(shù)。
細心的同學(xué)可能會發(fā)現(xiàn)這里有一個特殊的詞-偽隨機數(shù)。那么什么是偽隨機數(shù)呢?
關(guān)于偽隨機數(shù)的概念我就不多說了,大家自行搜索一下就有很多解釋,在這里我只說一下自己的理解:
先說一下真隨機,真隨機也就是我們?nèi)粘Uf的隨機,一個隨機事件的結(jié)果是不確定的,比如拋硬幣,在正常情況下,拋硬幣的結(jié)果是不確定的,換句話說,結(jié)果是不可預(yù)測的。
然后說說偽隨機,偽隨機是計算機生成隨機數(shù)的一種方式,計算機不能真正模仿隨機事件,而只能通過計算來生成隨機數(shù)。換句話說,如果我們知道了計算機計算隨機數(shù)的算法,我們是可以預(yù)測偽隨機數(shù)的。
當然我們得用例子說話。
從上面的討論我們可以知道,因為rand()產(chǎn)生的數(shù)字是偽隨機數(shù),所以它一定有一個固定的算法來生成偽隨機數(shù),那么算法是固定的,不固定的只有srand()所設(shè)置的種子了。
確定了這一點之后,我們就可以做實驗驗證我們的猜想了。
如果srand()設(shè)定的種子是一個固定值會發(fā)生什么?
srand(1);
int rand_number = rand();
在我執(zhí)行了N次之后,結(jié)果都是固定的。(大家可以親自試一試)
這就說明我們的“隨機數(shù)”就是通過某種算法計算出來的結(jié)果,所以要想這個結(jié)果發(fā)生變化,就需要設(shè)定一個不斷變化的“種子”。
那么這里也就解釋了“種子”的作用-用來給隨機數(shù)生成器提供一個輸入,之后隨機數(shù)生成器就會使用這個“種子”生成不同的偽隨機數(shù)。
舉個栗子~
如果我們的隨機數(shù)生成算法是這樣的:
rand=1+x;
那么我們的“種子”就是上式中的x,,每當我們輸入不同的x,產(chǎn)生的結(jié)果rand也就會不同。
至于為什么選擇time()作為“種子”嘛,上面說了,這個函數(shù)呢,用來獲取系統(tǒng)時間,因為系統(tǒng)時間是一直在變化的,就相當于我們隨機數(shù)的“種子”是在一直變化的,所以每次調(diào)用time()函數(shù),都會獲得不同的值,這樣我們的rand()每次生成的結(jié)果也就不一樣啦~
最后總結(jié)一下這三個函數(shù)在生成偽隨機數(shù)的時候是怎么配合的。
首先,time()獲取了系統(tǒng)時間;然后,srand()把獲取到的系統(tǒng)時間設(shè)置為rand()的“種子”;最后,由rand()通過計算,把“種子”轉(zhuǎn)換為一個數(shù)字。
好啦,這篇文章就寫到這里了~
歡迎大家訪問我的網(wǎng)站:https://bfss.github.io/,如果覺得我的文章幫到了您,可以在網(wǎng)站上點擊“支持我”對我進行鼓勵喲~(手機端網(wǎng)頁在左上角,電腦端網(wǎng)頁在右上角)
作者:北方素素
https://www.bilibili.com/read/cv311534
出處: bilibili