当下边界接近零时生成均匀随机变量

时间:2016-09-27 07:01:18

标签: r random boundary uniform-distribution

当我在R中跑步时{1}}  
我得到100个均匀分布的随机变量在0.1和0.0001之间。因此,0.0001和最小值(runif(100,max=0.1, min=1e-10))之间没有随机值。

如何在整个区间(最小值和最大值之间)生成均匀随机变量?

2 个答案:

答案 0 :(得分:3)

也许你的生成不足以让你看到它的可能性足够了:

> 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
在10000的样本中有5个。因此,在100个样本中得到一个的可能性是......(实际上,你可以完全根据统一分布的数量和属性来解决这个问题。)

答案 1 :(得分:2)

已编辑为将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")
}

Looks pretty uniform

直方图每个显示10个条,因此每个条的宽度约为.01(因为总范围约为0.1)。您感兴趣的范围约为0.0001。要在直方图中看到这一点,我们需要绘制每个绘图1,000个条形图,是条形图的100倍。当只有100个值时,使用1,000个箱子并没有多大意义。当然,几乎所有的箱子都是空的,特别是最低的箱子在我们上面计算的90%的时间里都是空的。

要获得更低的随机值,您的两个选择是:(a)从制服中绘制更多数字或(b)将分布更改为更接近0的权重。您可以尝试指数分布?或者,如果你想要一个硬上限,你可以扩展beta分布?你的另一个选择是根本不使用随机值,也许你想要均匀间隔的值,seq是你正在寻找的?