set.seed()作用

R語言中set.seed()作用是設(shè)定生成隨機數(shù)的種子,種子是為了讓結(jié)果具有重復性,重現(xiàn)結(jié)果。如果不設(shè)定種子,生成的隨機數(shù)無法重現(xiàn)。

> x<-rnorm(5) #隨機生成10個隨機數(shù)
> x
[1]  1.2359036  0.3247500 -0.8379907  0.6186568  0.1915741
> x<-rnorm(5) #再次隨機生成10個隨機數(shù)
> x<-rnorm(5)
> x
[1] -0.44325878  0.05537136  2.13691467 -1.10196137  0.22328708

兩個結(jié)果不相同

> set.seed(12345) #設(shè)定種子
> x<-rnorm(5) # 在設(shè)定種子的前提下生成10個隨機數(shù)
> x
[1]  0.5855288  0.7094660 -0.1093033 -0.4534972  0.6058875

> set.seed(12345) # 設(shè)定種子
> y<-rnorm(10)
> y<-rnorm(5)
> y
[1]  0.5855288  0.7094660 -0.1093033 -0.4534972  0.6058875
> x==y
[1] TRUE TRUE TRUE TRUE TRUE

后兩次在設(shè)定了相同的種子前提下,生成的隨機數(shù)是相同的。

說明,來源于網(wǎng)絡(luò)

計算機并不能產(chǎn)生真正的隨機數(shù),如果你不設(shè)種子,計算機會用系統(tǒng)時鐘來作為種子,如果你要模擬什么的話,每次的隨機數(shù)都是不一樣的,這樣就不方便你研究,如果你事先設(shè)置了種子,這樣每次的隨機數(shù)都是一樣的,便于重現(xiàn)你的研究,也便于其他人檢驗你的分析結(jié)果。

set.seed(3000),不是運行3000次,而是把種子設(shè)置為3000。

計算機的程序,都是通過確定的算法,根據(jù)確定的輸入,算出確定的輸出。想要得到真正的隨機,需要通過外接物理隨機數(shù)發(fā)生器,通過把隨機的物理過程轉(zhuǎn)變?yōu)殡S機值,才能實現(xiàn)。因此我們平常使用的計算機的隨機數(shù),其實都只是通過算法模擬得到,也就是偽隨機。一般采用的辦法是線性同余:

X[n+1] = (a * X[n] + c) mod m

為簡單起見,我取簡單的參數(shù)(a = 1, c = 3, m = 5),得到一個簡單的算式:

X[n+1] = (X[n] + 3) mod 5

這時,把X[0]視為種子,于是:

若種子為0,得到數(shù)列:0, 3, 1, 4, 2, 0, …

若種子為1,得到數(shù)列:1, 4, 2, 0, 3, 1, …

若種子為2,得到數(shù)列:2, 0, 3, 1, 4, 2, …

若種子為3,得到數(shù)列:3, 1, 4, 2, 0, 3, …

若種子為4,得到數(shù)列:4, 2, 0, 3, 1, 4, …

對于每個種子,所得到的數(shù)列看起來都是隨機的(每個數(shù)值出現(xiàn)的頻率都是相同的)。而一旦種子給定,每次調(diào)用隨機數(shù)函數(shù),函數(shù)都會根據(jù)上次得到的數(shù)列的某個值,計算出數(shù)列的下一個值并返回回來。而對于隨機浮點數(shù),一般是用隨機產(chǎn)生的整數(shù)除以最大整數(shù)得到。

所以,隨機數(shù)的種子一般只需要在調(diào)用隨機函數(shù)之前設(shè)置一次,不建議設(shè)置多次。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容