我使用sample
函数执行一些随机抽样操作。通常,随机数发生器基于种子值。如何确保每个R会话或每个样本调用都使用不同的种子值?
答案 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
,您应该阅读。