有时候我需要编写一个随机函数,它对于特定的输入总是返回相同的输出。我一直通过在函数顶部设置随机种子然后继续实现这个功能。考虑以下两个以此方式定义的函数:
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)
的结果呈现出“阶梯”分布,其中区间[0, 1]
的概率密度函数为3/4,区间[1, 2]
的概率密度函数为1/4。但由于上述不幸的相同随机种子选择,我看到了不同的结果:x <- sample.12(10000)
hist(rand.prod(x))
在这种情况下,我可以通过在其中一个函数中更改随机种子的值来解决此问题。例如,在rand.prod
中使用set.seed(10000)
,我会得到预期的分布:
之前在SO上,使用不同的种子被接受为生成独立随机数流的最佳方法。然而,我发现这个解决方案并不令人满意,因为具有不同种子的流可能与彼此相关(甚至可能是高度相关的);事实上,根据?set.seed
,它们甚至可能产生相同的流:
没有保证不同的种子值将不同地播种RNG,尽管任何例外都极为罕见。
是否有一种方法在R中实现一对随机化函数:
- 始终为特定输入返回相同的输出,并且
- 通过不仅仅使用不同的随机种子来强制执行它们的随机性源之间的独立性?
rlecuyer
使用MRG32k3a
(此论文第1.1章),因此它可能也有其局限性(就像Mersenne-Twister一样)。不过在99%的情况下应该不会有太大问题。 - tonytonov