下边界接近于零时生成均匀随机变量
Generate uniform random variable when lower boundary is close to zero
当我运行在R
runif(100,max=0.1, min=1e-10)
我得到 100 个均匀分布的随机变量 在 0.1 和 0.0001 之间。因此,0.0001 和最小值 (min=1e-10
) 之间没有随机值。
如何在整个区间(最小值和最大值之间)生成均匀的随机变量?
也许你没有产生足够的能量来使你看到一个的可能性足够大:
> 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 个样本中获得一个的机会是...(实际上,您可以根据均匀分布的数量和属性准确计算出这个值)。
(编辑以将 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
就是您要找的?
当我运行在Rrunif(100,max=0.1, min=1e-10)
我得到 100 个均匀分布的随机变量 在 0.1 和 0.0001 之间。因此,0.0001 和最小值 (min=1e-10
) 之间没有随机值。
如何在整个区间(最小值和最大值之间)生成均匀的随机变量?
也许你没有产生足够的能量来使你看到一个的可能性足够大:
> 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 个样本中获得一个的机会是...(实际上,您可以根据均匀分布的数量和属性准确计算出这个值)。
(编辑以将 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
就是您要找的?