0

我使用sample函数来执行一些随机采样操作。通常,随机数生成器是基于种子值的。如何确保每个 R 会话或每个示例调用将使用不同的种子值?

4

1 回答 1

4

每当第一次需要 RNG 的种子时,R 会根据当前时间和正在运行的 R 会话的进程 ID 生成一个。设置种子的唯一(简单)方法是 via set.seed(),因此假设您不保存和恢复会话之间的种子(如果您希望存储种子,这是可能的,甚至是可重复研究的一个功能)并且不要使用相同的种子调用set.seed(),您应该为每个会话获得不同的种子。

要为每次调用 获取不同的种子sample,您必须在某种程度上模拟 R 所做的事情,并在每次调用 之前将种子设置为某个新值sample。这可能最好由包装函数安排,该函数将种子设置为新值然后调用sample.

例如:

Sample <- function(seed, ..., verbose = FALSE) {
  if(missing(seed))
    seed <- floor(as.numeric(Sys.time()) + Sys.getpid())
  if(verbose)
    writeLines(paste("Using seed:", seed))
  set.seed(seed)
  sample(...)
}

> Sample(x = 10)
 [1]  7  3  8  9 10  2  4  5  6  1
> Sample(x = 10, verbose = TRUE)
Using seed: 1365040429
 [1]  9  5  7 10  6  8  1  4  3  2
> Sample(x = 10, verbose = TRUE)
Using seed: 1365040431
 [1]  6  9  3  5  2  1 10  8  7  4
> Sample(x = 10, verbose = TRUE)
Using seed: 1365040432
 [1]  9  6  8  1  2 10  3  4  7  5

这并不完美 - 如果你调用Sample得太快(每秒超过一次),相同的种子将被用于在那一秒内调用的那些运行。

更多详细信息在 中?Random,您应该阅读。

于 2013-04-03T22:11:52.413 回答