R set.seed()的范围

时间:2014-08-26 18:53:13

标签: r random seed

My R脚本调用包含set.seed()的子函数。 set.seed()的范围是什么?它会影响调用它的主程序吗?

更具体地说

# main program
callsubfun()

... some statement ...

sample.int(100,20)



# sub function
callsubfun <- function(x,y,...){
   set.seed(100)
   ... do the work ...
   return(something)
}

4 个答案:

答案 0 :(得分:9)

set.seed确实是全球性的。但请注意?set.seed中的示例:

## If there is no seed, a "random" new one is created:
rm(.Random.seed); runif(1); .Random.seed[1:6]

这意味着你可以在你的功能结束时或在你调用函数之后调用rm(.Random.seed, envir=.GlobalEnv)来解除程序的其余部分与函数中set.seed的调用。

要查看此操作,请在两个不同的R会话中运行以下代码。两个会话的输出应该相同。然后在两个新的R会话中重新运行代码,同时取消注释rm行。您将看到两个新会话中的输出现在不同,表示函数中对set.seed的调用未将重现性转移到主程序。

subfun <- function() {
    set.seed(100)
    rnorm(1)
    #rm(.Random.seed, envir=.GlobalEnv)
}

subfun()
#[1] -0.5022

rnorm(1)
# [1] 0.1315

答案 1 :(得分:3)

这就是你不应该这样做的原因:

> set.seed(100)
> rnorm(1)
[1] -0.5021924
> rnorm(1)
[1] 0.1315312

> rand <- function() set.seed(100)
> rand()

> rnorm(1)
[1] -0.5021924   # Ouch!

答案 2 :(得分:0)

set.seed函数在其自身之后为所有代码提供特定的随机状态。但是,之前的代码不会受到影响。 这是一个最小的例子。

rnorm(1)
#> [1] -0.1020965
set.seed(123)
rnorm(1)
#> [1] -0.5604756
rnorm(1)
#> [1] -0.2301775
rnorm(1)
#> [1] 1.558708

reprex package(v0.2.0)于2018-10-20创建。

rnorm(1)
#> [1] 0.4665633
set.seed(123)
rnorm(1)
#> [1] -0.5604756
rnorm(1)
#> [1] -0.2301775
rnorm(1)
#> [1] 1.558708

reprex package(v0.2.0)于2018-10-20创建。

  1. 您会发现set.seed旁边的所有代码都固定为给定的随机状态。
  2. 但是set.seed之前的代码在两次试验之间是不同的,这支持了我的观点。

答案 3 :(得分:-1)

BondedDust的答案还可以,但不是哎呀!

您可以使用set.seed()来重现您的 算法。即任何人都可以重现你的结果。

如果你想分享你的话,我建议你使用set.seed 码。例如,如果您想在stackoverflow中获得一些帮助,我们可以 准确再现您的代码。

set.seed(123)
rand<-rnorm(10)
plot(density(rand))

如果您使用其他种子,则会获得其他结果

set.seed(234)
rand<-rnorm(10)
plot(density(rand))

两者都是正确的,但如果种子已知,可能更容易帮助你。 顺便说一下,只需在你的rutine中使用一次set.seed,因为你可以生成 你的随机数依赖。我们需要独立的随机数 在模拟中。