set.seed()在本地环境中

时间:2013-04-30 15:08:23

标签: r random

是否可以在不影响以下随机数生成的本地环境中使用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)

2 个答案:

答案 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