2013-04-03 114 views
0

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

+0

'?Random'中的Note部分回答你的问题吗? – joran 2013-04-03 22:11:19

+0

为什么你想每次调用'样本'重复运行'样本'而不需要改变种子会产生不同的伪随机样本 - 你不需要每次都明确设置种子来实现这个壮举。 – 2013-04-03 22:21:33

+0

对于每个R会话都有不同的种子,但不是每个样本调用都很好。 – Nishanth 2013-04-04 03:59:11

回答

4

无论何时首先需要用于RNG的种子,R会从当前时间和正在运行的R会话的进程ID中生成一个。设置种子的唯一(简单)方法是通过set.seed(),所以假设你不保存和恢复会话之间的种子(这是可能的,甚至是可重复研究的特征,如果你想存储种子)不要将set.seed()与相同的种子联系起来,您应为每个会话获得不同的种子。

要获得用于sample的每次调用的不同种子,您必须在每次调用sample之前模拟R的某种程度并将种子设置为某个新值。这可能是最好的包装功能,它将种子设置为新值然后调用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,你应该阅读。