当我在 R 中运行时,我得到0.1 和 0.0001 之间
runif(100,max=0.1, min=1e-10)
的100 个均匀分布的随机变量。因此,在 0.0001 和最小值 ( ) 之间没有随机值。如何在整个区间(最小值和最大值之间)生成均匀的随机变量?min=1e-10
2 回答
也许你生成的不够多,以至于你已经看到了一个:
> range(runif(100,max=0.1,min=exp(-10)))
[1] 0.00199544 0.09938462
> range(runif(1000,max=0.1,min=exp(-10)))
[1] 0.0002407759 0.0999674631
> range(runif(10000,max=0.1,min=exp(-10)))
[1] 5.428209e-05 9.998912e-02
它们多久发生一次?
> sum(runif(10000,max=0.1,min=exp(-10)) < .0001)
[1] 5
5 在那个 10000 的样本中。所以在 100 的样本中得到一个的机会是……(实际上你可以从均匀分布的数量和属性中准确地计算出来)。
(编辑替换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
您正在寻找什么?