有时我想编写一个随机函数,它总是返回特定输入的相同输出.我总是通过在函数顶部设置随机种子然后继续实现它.考虑以这种方式定义的两个函数:
sample.12 <- function(size) {
set.seed(144)
sample(1:2, size, replace=TRUE)
}
rand.prod <- function(x) {
set.seed(144)
runif(length(x)) * x
}
Run Code Online (Sandbox Code Playgroud)
sample.12返回从集合中随机取样的指定大小的矢量{1, 2}和rand.prod由从均匀地选择的随机值相乘指定向量的每个元素[0, 1].通常情况下,我希望x <- sample.12(10000) ; rand.prod(x)有一个"步骤"分布,范围内的pdf 3/4和范围内的[0, 1]1/4 [1, 2],但由于我不幸选择上面相同的随机种子,我看到了不同的结果:
x <- sample.12(10000)
hist(rand.prod(x))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以通过将其中一个函数中的随机种子更改为其他值来解决此问题.例如,set.seed(10000)在rand.prod我得到预期的分布:

以前在SO上,这种使用不同种子的解决方案已被接受为生成独立随机数流的最佳方法.然而,我发现解决方案不令人满意,因为具有不同种子的流可能彼此相关(可能甚至彼此高度相关); 事实上,根据以下情况,它们甚至可能产生相同的流?set.seed:
不能保证种子的不同值会以不同的方式为RNG播种,尽管任何例外都是非常罕见的.
有没有办法在R中实现一对随机函数: