2013-04-22 101 views
2

我必須生成一個隨機數列表,他們必須有一個給定的平均差。例如,給定的平均差是10,所以這些數字是好的:1 3 5 9 15 51。我所做的是將給定的平均差乘以2並加1.像這樣:生成具有一定平均差的隨機數列表

while (i <= 50000) 
    { 
     i += Math.random() * givenAverageDiff * 2 + 1; 
     list.add(i); 
    } 

但是我永遠不會得到5000或更多。事實上,它始終是4,850或更少。爲什麼?假設givenAverageDiff是10.我的錯誤是什麼?我該如何解決它?

P.S.用C或PHP實現對我來說也是很好的。

+0

什麼是「平均差異」? – 2013-04-22 17:23:02

+0

我不知道是否有類型轉換搞東西。我假設'我'是一個'int'。 'givenAverageDiff'是'int'還是'double'? – 2013-04-22 17:23:59

+1

@Eddy_Em我認爲這意味着M項的序列正在增加,並且對於n = 0到M-1 =(avg_difference)*(M-1)的總和(i_n + 1-i_n)。我不明白你如何保證這一點,並保持任何隨機性的外表。 – 2013-04-22 17:27:17

回答

1

因爲你在做「+ 1」。

讓我們計算預期的差:

E(2 * 10 * X + 1)= 2 * 10 * E(X)+ 1 = 2 * 10 * 0.5 + 1 = 10 + 1。所以,平均你會得到50000/11號碼。

你需要挑事,其期望值等於10將其更改爲以下,它應該工作:

while (i <= 50000) 
    { 
     i += Math.random() * (givenAverageDiff-1) * 2 + 1; 
     list.add(i); 
    } 
+1

我不確定這個計算是否得到正確的期望值... – 2013-04-22 18:29:21

+0

@RobWatts更正了它。 – ElKamina 2013-04-22 18:41:54

1

想想在你創建的範圍方面。以您目前的計算,

i += Math.random() * givenAverageDiff * 2 + 1; 

你是1和2 * givenAverageDiff之間添加到您的號。 1到2x的總和爲(2x)(2x + 1)/ 2,並且由於有2x選項,所以我們除以2x得到(2x)(2x + 1)/(2 * 2x)=(2x + 1)/2 = x + 0.5。

所以你想要的是有2x + 1選項,這是最簡單的使用範圍[0,2 * x]。你可以通過添加括號:

i += Math.random() * (givenAverageDiff * 2 + 1); 

如果你希望它永遠增加,那麼您可能需要使用非均勻分佈,或均勻分佈範圍較小。爲了得到一個範圍[N,2 * X-N]使用

i += Math.random() * ((givenAverageDiff - n) * 2 + 1) + n; 

如果使用負值爲n可以擴大範圍,從而有可能爲數字減少爲好。