【发布时间】:2017-09-06 01:49:33
【问题描述】:
我是responding 向Reddit AskScience 提出的问题,我遇到了关于runif() 的功能的一些奇怪的东西。我试图从 1 到 52 统一采样一组。我的第一个想法是使用 runif():
as.integer(runif(n, min = 1, max = 52))
但是,我发现该操作从未产生 52 的值。例如:
length(unique(as.integer(runif(1000000, 1, 52))))
[1] 51
出于我的目的,我只是转而使用sample():
sample(52, n, replace = TRUE)
在 runif() 文档中它指出:
runif 不会生成任何一个极值,除非 max = min 或 max-min 与 min 相比较小,尤其是对于默认参数而言。
我想知道为什么runif() 会这样。如果它试图均匀地生成样本,它似乎应该能够从集合中产生“极值”。这是一项功能吗?为什么?
【问题讨论】:
-
恰好得到 52 的概率为 0。为什么您对没有观察到概率为 0 的预先指定的事件感到惊讶?
-
均匀分布是连续的 - 在连续分布中对任何给定值进行采样的概率为零,只有在分布的 间隔 上才能获得有限的概率 - 所以你'即使没有实现怪癖,也不太可能最终采样
52.000000...。 -
我在最初尝试执行采样时确实犯了一些错误。这让我想到了一个更有趣的问题,为什么 runif() 不会产生极值。 Ben Bolker 很好地回答了这个问题。
-
与
runif一起使用的替代方法是ceiling(runif(100, min = 0, max = 52))。
标签: r