美文网首页
set.seed()作用

set.seed()作用

作者: 一刀YiDao | 来源:发表于2016-09-08 10:43 被阅读710次

    R语言中set.seed()作用是设定生成随机数的种子,种子是为了让结果具有重复性,重现结果。如果不设定种子,生成的随机数无法重现。

    > x<-rnorm(5) #随机生成10个随机数
    > x
    [1]  1.2359036  0.3247500 -0.8379907  0.6186568  0.1915741
    > x<-rnorm(5) #再次随机生成10个随机数
    > x<-rnorm(5)
    > x
    [1] -0.44325878  0.05537136  2.13691467 -1.10196137  0.22328708
    
    两个结果不相同
    
    > set.seed(12345) #设定种子
    > x<-rnorm(5) # 在设定种子的前提下生成10个随机数
    > x
    [1]  0.5855288  0.7094660 -0.1093033 -0.4534972  0.6058875
    
    > set.seed(12345) # 设定种子
    > 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
    

    后两次在设定了相同的种子前提下,生成的随机数是相同的。

    说明,来源于网络

    计算机并不能产生真正的随机数,如果你不设种子,计算机会用系统时钟来作为种子,如果你要模拟什么的话,每次的随机数都是不一样的,这样就不方便你研究,如果你事先设置了种子,这样每次的随机数都是一样的,便于重现你的研究,也便于其他人检验你的分析结果。

    set.seed(3000),不是运行3000次,而是把种子设置为3000。

    计算机的程序,都是通过确定的算法,根据确定的输入,算出确定的输出。想要得到真正的随机,需要通过外接物理随机数发生器,通过把随机的物理过程转变为随机值,才能实现。因此我们平常使用的计算机的随机数,其实都只是通过算法模拟得到,也就是伪随机。一般采用的办法是线性同余:

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

    为简单起见,我取简单的参数(a = 1, c = 3, m = 5),得到一个简单的算式:

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

    这时,把X[0]视为种子,于是:

    若种子为0,得到数列:0, 3, 1, 4, 2, 0, …
    
    若种子为1,得到数列:1, 4, 2, 0, 3, 1, …
    
    若种子为2,得到数列:2, 0, 3, 1, 4, 2, …
    
    若种子为3,得到数列:3, 1, 4, 2, 0, 3, …
    
    若种子为4,得到数列:4, 2, 0, 3, 1, 4, …
    

    对于每个种子,所得到的数列看起来都是随机的(每个数值出现的频率都是相同的)。而一旦种子给定,每次调用随机数函数,函数都会根据上次得到的数列的某个值,计算出数列的下一个值并返回回来。而对于随机浮点数,一般是用随机产生的整数除以最大整数得到。

    所以,随机数的种子一般只需要在调用随机函数之前设置一次,不建议设置多次。

    相关文章

      网友评论

          本文标题:set.seed()作用

          本文链接:https://www.haomeiwen.com/subject/isesettx.html