有時我想編寫一個隨機函數,它總是爲特定輸入返回相同的輸出。我一直通過在函數頂部設置隨機種子然後繼續執行此操作。考慮以這種方式定義了兩個功能:設置隨機種子獨立功能
sample.12 <- function(size) {
set.seed(144)
sample(1:2, size, replace=TRUE)
}
rand.prod <- function(x) {
set.seed(144)
runif(length(x)) * x
}
sample.12
返回從集合{1, 2}
和rand.prod
乘以隨機值指定的矢量的每個元素從[0, 1]
均勻地隨機選擇採樣的指定大小的矢量。通常我會想到x <- sample.12(10000) ; rand.prod(x)
有在範圍[1, 2]
範圍[0, 1]
和1/4「臺階」與PDF 3/4分佈,但由於我的不幸的選擇相同的隨機種子上面我看到了不同的結果:
x <- sample.12(10000)
hist(rand.prod(x))
我可以改變的功能之一的隨機種子爲其他值修正在這種情況下這個問題。例如,在rand.prod
set.seed(10000)
我得到預期的分佈:
Previously on SO使用不同的種子該解決方案已被認爲是獨立產生的隨機數流的最佳方法。但是,我發現解決方案不令人滿意,因爲具有不同種子的流可能彼此相關(甚至可能爲highly related to one another);事實上,他們可能會根據?set.seed
甚至產生相同的流:
沒有保證種子的不同值會有所不同播種RNG,儘管任何的例外是極其罕見的。
有沒有實現對隨機函數中的R一個辦法:
- 總是返回特定輸入相同的輸出,並
- 由多個執行其隨機性源之間的獨立性比只使用不同的隨機種子?
很棒的發現。爲了完整起見,'rlecuyer'使用'MRG32k3a'(本文的第1.1章(http://www.iro.umontreal.ca/~lecuyer/myftp/papers/streams00.pdf)),所以它可能也有其侷限性(就像Mersenne-Twister所做的那樣)。儘管如此,99%的案例不應該成爲問題。 – tonytonov