2016-05-12 41 views
3

我偶然發現了這一點,試圖從一些數據做一個隨機偏差樣本。似乎適合x^2的簡單分佈是我正在尋找的東西,但是這裏有一個人造物,我不能完全包裹我的頭。隨機指數分佈怪異

下面是一個for循環的代碼片段,選擇由x^2分佈的數組中的索引,然後在該索引位置增加計數器。

package main 
import "time" 
import "fmt" 
import "math" 
import "math/rand" 

func main() { 
    rand.Seed(time.Now().UTC().UnixNano()) 

    var arr [10]int 

    for i := 0; i < 5000; i++ { 
    rnd := rand.Float64() 
    tmp := rnd * rnd * 9 

    index := int(math.Floor(tmp + .5)) 

    arr[index]++ 
    } 
    fmt.Printf("%v", arr) 
} 

無論界限或迭代次數,繪製圖總是找出來這樣的價值觀,用noticable「滴」的結尾。

enter image description here

這是我很難理解。這些指標不應該一直適合曲線嗎?

我懷疑有關四捨五入的東西,但我現在正在抓秸稈。

回答

1

首先,你的X-規模是一種誤導,因爲它從1開始,以10結尾。應該是0 ... 9。

考慮到它是固定的,你的分佈是完全正確的,雖然也許沒有打算(你實際上想要什麼?)。

您首先有一個介於0和9之間的分佈,包括兩端在內。如果你添加0.5,然後下降,問自己有多少點擊每個索引可以「獲得」

:大多數索引得到「全套」與1和2(或圖6和7,或者任何其他時間間隔)之間的十進制值,其被向下舍入到1(或6,或任何指數)

EXCEPT

邊緣指標 0和9只得到一個 「半全套」。

因爲你偏移量索引0 ... 1到0.5 ... 1.5和向下取整。這個範圍中只有一半將保持索引= 0,即。值介於0之間。5和1(因爲不再有0和0.5之間的任何值)。

和其他的一樣。您將8 ... 9抵消到8.5 ... 9.5,然後向下取整。索引9僅獲得1/2,即。值在9和9.5之間。

您的圖表的左端實際上比您預期的要低,儘管它與右端沒有區別。

這些數字確實有時令人驚訝:-)。

5

問題是你的分佈範圍[0,1],然後你乘以9,使範圍[0,9],然後你加0.5,這使得範圍[0.5,9.5] 。

不僅最後一個索引值有明顯的下降,第一個索引值也有一個不明顯的下降,因爲每個桶只有一半填滿。

你有沒有考慮只需10,而不是9

tmp := rnd * rnd * 10 

然後乘以離開關在三樓+ 0.5?

index := int(math.Floor(tmp)) 

產生分佈像你所期望的,這裏有一個循環去到50幾個結果:

[157949 65411 50239 42599 37637 33706 31200 28789 26927 25543] 
[158302 65533 49712 42480 37347 33882 30987 28696 27225 25836] 
[157824 65627 50432 42328 37307 33900 30787 29006 26975 25814] 
+0

直覺地板[0.5,9.5]的範圍仍然是[0,9],但是對不對?這就是我想要的。繪製你的分佈似乎反而在開始時有一個「跳躍」,而不是:[http://www.wolframalpha.com/input/?i=plot+%5B157949+65411+50239+42599+37637+33706+31200+28789+ 26927 + 25543%5D](http://www.wolframalpha.com/input/?i=plot+%5B157949+65411+50239+42599+37637+33706+31200+28789+26927+25543%5D) – rhardih