我使用sample
函数来执行一些随机采样操作。通常,随机数生成器是基于种子值的。如何确保每个 R 会话或每个示例调用将使用不同的种子值?
问问题
173 次
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 回答