关于随机数发生器中的种子规范

时间:2013-04-03 21:58:17

标签: r

我使用sample函数执行一些随机抽样操作。通常,随机数发生器基于种子值。如何确保每个R会话或每个样本调用都使用不同的种子值?

1 个答案:

答案 0 :(得分:4)

每当首次需要RNG的种子时,R就会从当前时间生成一个,并为正在运行的R会话生成进程ID。设置种子的唯一(简单)方法是通过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,您应该阅读。