(已编辑以将 exp(-10) 替换为 1e-10)
给定0.1 的最大值和1e-10 的最小值,任何给定值小于1e-4 的概率由下式给出
(1e-4 - 1e-10) / (0.1 - 1e-10) = 9.99999e-04
这个分布中的 100 个随机值都大于1e-4 的概率是
(1 - 9.99999e-04) ^ 100 = 0.90479
大约 90.5%。因此,在从该分布中抽取 100 个数字时,您一点也不应该感到惊讶,您看到的数字不小于 1e-4。理论上,这预计超过 90.5% 的时间。我们甚至可以在模拟中验证这一点:
set.seed(47) # for replicability
# 100,000 times, draw 100 numbers from your uniform distribution
d = replicate(n = 1e5, runif(100, max = 0.1, min = 1e-10))
# what proportion of the 100k draws have no values less than 1e-4?
mean(colSums(d < 1e-4) == 0)
# [1] 0.90557
# 90.56% - very close to our calculated 90.48%
为了更精确,我们可以重复更多次
# same thing, 1 million replications
d2 = replicate(n = 1e6, runif(100, max = 0.1, min = 1e-10))
mean(colSums(d2 < 1e-4) == 0)
# [1] 0.90481
因此,对于 1MM 复制,runif() 几乎完全符合预期。与0.90481 - 0.90479 = 0.00002 的预期不同。我会说绝对没有证据表明runif 已损坏。
我们甚至可以绘制一些复制的直方图。以下是前 20 个:
par(mfrow = c(4, 5), mar = rep(0.4, 4))
for (i in 1:20) {
hist(d[, i], main = "", xlab = "", axes = F,
col = "gray70", border = "gray40")
}
直方图每个显示 10 个条形图,因此每个条形图的宽度约为 .01(因为总范围约为 0.1)。您感兴趣的范围约为0.0001 宽。要在直方图中看到这一点,我们需要在每个图中绘制 1,000 个条形图,是条形图的 100 倍。当只有 100 个值时,使用 1,000 个 bin 没有多大意义。当然,几乎所有的垃圾箱都是空的,尤其是最低的垃圾箱,大约 90% 的时间都是空的,正如我们上面计算的那样。
要获得更多非常低的随机值,您的两个选择是 (a) 从均匀分布中提取更多数字或 (b) 将分布更改为权重更接近 0 的分布。您可以尝试指数分布吗?或者,如果你也想要一个硬上限,你可以扩展一个 beta 分布?您的另一个选择是根本不使用随机值,也许您想要均匀间隔的值,seq 就是您要找的?