主要作用:可重現(xiàn)一樣的結(jié)果
R語言中set.seed()作用是設(shè)定生成隨機數(shù)的種子弦牡,目的是為了讓結(jié)果具有重復(fù)性,重現(xiàn)結(jié)果漂羊。
- 不設(shè)定種子不行嗎驾锰?當然可以,但是結(jié)果就不能復(fù)現(xiàn)走越。如:
x<-rnorm(3) #隨機生成3個隨機數(shù)
結(jié)果:1.4197419 -0.7460519 0.3603622
x<-rnorm(3) #再來一遍椭豫,生成的3個隨機數(shù)又不一樣了
結(jié)果:1.0796213 0.5598334 0.5344839
- 設(shè)定種子后,再試下:
set.seed(123)
x<-rnorm(3) #隨機生成3個隨機數(shù)
結(jié)果:-0.5604756 -0.2301775 1.5587083
x<-rnorm(3) #試圖復(fù)現(xiàn)上邊結(jié)果
結(jié)果:0.07050839 0.12928774 1.71506499
#哎呀旨指,還是不一樣啊赏酥,哪里復(fù)現(xiàn)了?騙子谆构!
#那是因為你沒有加上set.seed(123)裸扶!加上之后如下:
set.seed(123)
x<-rnorm(3) #隨機生成3個隨機數(shù)
結(jié)果:-0.5604756 -0.2301775 1.5587083
#怎么樣,一樣了吧搬素?別人想復(fù)現(xiàn)你的結(jié)果呵晨,必須要把種子seed和你設(shè)的一樣。
注:set.seed(1000)蔗蹋,不是運行1000次何荚,而是把種子設(shè)置為1000。
那么問題來了:設(shè)成100呢猪杭,1呢餐塘?有什么區(qū)別?(見下面的問答部分)
這些數(shù)怎么產(chǎn)生的(產(chǎn)生原理)皂吮?
偽隨機產(chǎn)生的戒傻。計算機的程序,都是通過確定的算法蜂筹,根據(jù)確定的輸入需纳,算出確定的輸出。想要得到真正的隨機艺挪,需要通過外接物理隨機數(shù)發(fā)生器不翩,通過把隨機的物理過程轉(zhuǎn)變?yōu)殡S機值,才能實現(xiàn)麻裳。因此我們平常使用的計算機的隨機數(shù)口蝠,其實都只是通過算法模擬得到,也就是偽隨機津坑。一般采用的辦法是線性同余
(進一步了解線性同余可參考下面的連接2妙蔗,也可自行百度)。
- 問:set seed 后面跟的數(shù)字有什么用疆瑰,比如 set seed 100 和 set seed 1000的區(qū)別是什么眉反?
- 答:數(shù)字不同昙啄,產(chǎn)生的結(jié)果不同。只有數(shù)字相同寸五,別人才能復(fù)制出來跟你一樣的結(jié)果梳凛。所以有些老師讓學(xué)生作業(yè)上用 set seed(學(xué)號)來防止作弊。
- 問:set seed #為什么一般都很大呢播歼?如果設(shè)為一位數(shù)伶跷,會不會有問題掰读?如設(shè)為1秘狞。
- 答:Stata的說明里說 “Without loss of pseudorandomness, the seed may be set to small numbers; e.g., set seed = 2.”,即可以設(shè)置很小蹈集,(不丟失偽隨機性的前提下)沒問題的烁试。
參考文獻:
(1)簡書:http://www.reibang.com/p/38d0a44630f8
(2)經(jīng)管之家1:https://bbs.pinggu.org/thread-2121186-1-1.html
(3)經(jīng)管之家2:https://bbs.pinggu.org/thread-336973-2-1.html