R語言中set.seed()作用是設(shè)定生成隨機(jī)數(shù)的種子,種子是為了讓結(jié)果具有重復(fù)性,重現(xiàn)結(jié)果。如果不設(shè)定種子,生成的隨機(jī)數(shù)無法重現(xiàn)。
> x<-rnorm(5) #隨機(jī)生成10個(gè)隨機(jī)數(shù)
> x
[1] 1.2359036 0.3247500 -0.8379907 0.6186568 0.1915741
> x<-rnorm(5) #再次隨機(jī)生成10個(gè)隨機(jī)數(shù)
> x<-rnorm(5)
> x
[1] -0.44325878 0.05537136 2.13691467 -1.10196137 0.22328708
兩個(gè)結(jié)果不相同
> set.seed(12345) #設(shè)定種子
> x<-rnorm(5) # 在設(shè)定種子的前提下生成10個(gè)隨機(jī)數(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è)定了相同的種子前提下,生成的隨機(jī)數(shù)是相同的。
說明,來源于網(wǎng)絡(luò)
計(jì)算機(jī)并不能產(chǎn)生真正的隨機(jī)數(shù),如果你不設(shè)種子,計(jì)算機(jī)會(huì)用系統(tǒng)時(shí)鐘來作為種子,如果你要模擬什么的話,每次的隨機(jī)數(shù)都是不一樣的,這樣就不方便你研究,如果你事先設(shè)置了種子,這樣每次的隨機(jī)數(shù)都是一樣的,便于重現(xiàn)你的研究,也便于其他人檢驗(yàn)?zāi)愕姆治鼋Y(jié)果。
set.seed(3000),不是運(yùn)行3000次,而是把種子設(shè)置為3000。
計(jì)算機(jī)的程序,都是通過確定的算法,根據(jù)確定的輸入,算出確定的輸出。想要得到真正的隨機(jī),需要通過外接物理隨機(jī)數(shù)發(fā)生器,通過把隨機(jī)的物理過程轉(zhuǎn)變?yōu)殡S機(jī)值,才能實(shí)現(xiàn)。因此我們平常使用的計(jì)算機(jī)的隨機(jī)數(shù),其實(shí)都只是通過算法模擬得到,也就是偽隨機(jī)。一般采用的辦法是線性同余:
X[n+1] = (a * X[n] + c) mod m
為簡(jiǎn)單起見,我取簡(jiǎn)單的參數(shù)(a = 1, c = 3, m = 5),得到一個(gè)簡(jiǎn)單的算式:
X[n+1] = (X[n] + 3) mod 5
這時(shí),把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, …
對(duì)于每個(gè)種子,所得到的數(shù)列看起來都是隨機(jī)的(每個(gè)數(shù)值出現(xiàn)的頻率都是相同的)。而一旦種子給定,每次調(diào)用隨機(jī)數(shù)函數(shù),函數(shù)都會(huì)根據(jù)上次得到的數(shù)列的某個(gè)值,計(jì)算出數(shù)列的下一個(gè)值并返回回來。而對(duì)于隨機(jī)浮點(diǎn)數(shù),一般是用隨機(jī)產(chǎn)生的整數(shù)除以最大整數(shù)得到。
所以,隨機(jī)數(shù)的種子一般只需要在調(diào)用隨機(jī)函數(shù)之前設(shè)置一次,不建議設(shè)置多次。