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)
}
答案 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创建。
set.seed
旁边的所有代码都固定为给定的随机状态。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,因为你可以生成 你的随机数依赖。我们需要独立的随机数 在模拟中。