2013-04-03 35 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,你應該閱讀。