1

是否可以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)
4

2 回答 2

2

来自?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
于 2013-04-30T15:16:48.817 回答
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

于 2020-08-08T07:35:54.760 回答