是否可以在不影响以下随机数生成的本地环境中使用set.seed()
?在一些函数中设置种子以获得可重现的结果是常见的,但我认为这是不幸的,因为即使在环境之外它也会影响下一代随机数。
有没有可能避免这种行为?
set.seed(123)
runif(1) #[1] 0.2875775
runif(1) #[1] 0.7883051
local({
set.seed(123)
print(runif(1))
})
#[1] 0.2875775
runif(1) #[1] 0.7883051 (This should not be the second number again)
答案 0 :(得分:3)
来自?set.seed
:
[如果]没有种子;当需要一个时,从当前时间(以及自R 2.14.0,进程ID)创建一个新的。
set.seed(42)
rnorm(1)
#[1] 1.370958
rm(.Random.seed)
rnorm(1)
#[1] -0.4352643
set.seed(42)
rnorm(1)
#[1] 1.370958
rm(.Random.seed)
rnorm(1)
#[1] -2.338973
答案 1 :(得分:0)
您可以在函数的开头设置种子,然后在退出时恢复旧种子。这是一个在功能后进行测试的快速演示。
rnorm_seed <- function(n, mean = 0, sd = 1, seed = NULL) {
if (!is.null(seed)) {
# reinstate system seed after simulation
sysSeed <- .GlobalEnv$.Random.seed
on.exit({
if (!is.null(sysSeed)) {
.GlobalEnv$.Random.seed <- sysSeed
} else {
rm(".Random.seed", envir = .GlobalEnv)
}
})
set.seed(seed, kind = "Mersenne-Twister", normal.kind = "Inversion")
}
rnorm(n, mean, sd)
}
# test
set.seed(8675309)
rnorm(1) # -0.9965824
rnorm(1) # 0.7218241
rnorm(1) # -0.6172088
set.seed(8675309)
rnorm(1) # -0.9965824
rnorm(1) # 0.7218241
rnorm_seed(1, seed = 8675309) # -0.9965824
rnorm(1) # -0.6172088