【发布时间】:2015-09-12 19:57:25
【问题描述】:
有时我想编写一个随机函数,它总是为特定输入返回相同的输出。我总是通过在函数顶部设置随机种子然后继续来实现这一点。考虑以这种方式定义的两个函数:
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) 有一个“阶梯”分布,pdf 3/4 在[0, 1] 范围内,1/4 在[1, 2] 范围内,但由于我不幸选择了上面相同的随机种子,我看到了不同的结果:
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 中实现一对随机函数:
- 始终为特定输入返回相同的输出,并且
- 不只是使用不同的随机种子来强制它们的随机源之间的独立性?
【问题讨论】:
标签: r random random-sample random-seed