2016-09-27 81 views
0

当我中的R

runif(100,max=0.1, min=1e-10)

运行余得到100个均匀分布的随机变量0.1和0.0001之间。所以,在0.0001和最小值之间没有随机值(min=1e-10)。

如何在整个区间(最小值和最大值之间)生成均匀随机变量?生成均匀随机变量时下限为接近零

+0

你是什么意思的“随机变量”? – Hugh

+0

实现一个随机变量 – novi

+0

你上一轮的编辑对我来说似乎很奇怪......“值”是复数,而不是单数......你的最后一句话是一个问题......但无论如何...... –

回答

2

编辑与1e-10更换exp(-10)

鉴于你的0.11e-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个值时,使用1000个垃圾箱没有多大意义。当然,几乎所有的垃圾箱都是空的,特别是最低的垃圾箱在我们上面计算的时间里大约有90%是空的。为了得到更低的随机值,你的两个选择是(a)从统一中抽取更多的数字或(b)将分布更接近0的分布。你可以试试指数分布吗?或者,也许,如果你想要一个硬性上限,你可以扩展一个beta版本?你的另一种选择是根本不使用随机值,也许你想要均匀分布的值,seq是你在找什么?

+0

最小值是0.0000000001或类似的东西(而不是像我写的exp(-10))。对不起。 但我需要覆盖整个区间的均匀分布。它接近我,R有一些局限性,我不知道如何克服。 – novi

+2

除非您编辑您的问题以显示它,否则我们不相信R中存在限制。由于可能数字的分布变得不均匀,所以对于小数字的浮点算法可能存在限制,但不应该发生在1e-10。 – Spacedman

+1

美丽的小复数情节。我可以在'hist()'调用中推荐'col =“gray”'...? –

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样本中的几率是...(其实你可以从准确的数量和均匀分布的特性来解决这一问题)。

+0

运行runif(200,max = 0.1,min = exp(-10)),得到0.000451和0.09921之间非常好的分布值。我在这两个值之间做了15个块,其中每个块包含10到15个这些生成的值。并且有0个值小于0.000451。所以,我的最小 - 最大间隔的一半没有被这些数据覆盖,而另一半是非常好的填充。 如果我生成$ 1e^{6} $个随机变量,那么我将得到一些较小的值,但是...在整个区间内没有均匀分布。 – novi

+1

“*我的最小 - 最大间隔的一半没有被覆盖*”这个平面错误。您的比例从'exp(-10)= 4.5e-5'变为'0.1',总间隔宽度为'0.0999546'。您的观测值从'0.000451'到'0.09921',观测值为'0.098759'。以观察到的总宽度的比率,你有98.8%的覆盖率!你是否想要随机值均匀分布在对数尺度*上? – Gregor

+0

我打字不好。最小值是0.0000000001或类似的东西(而不是像我写的exp(-10))。对不起。我没有复制 - >粘贴R代码(我应该这样做)。 – novi