2016-09-27 52 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