2013-11-23 22 views
3

供參考:隨機==僞隨機當生成正態分佈的隨機值時,定義範圍的最有效方法是什麼?

A.產生均勻隨機數的情況下,我可以指定一個範圍,即:

(Math.random()-Math.random())*10+5 
//generates numbers between -5 and 15 

B.產生具有版本的一組隨機值的高斯式的正常隨機性:

//pass in the mean and standard deviation 
function randomNorm(mean, stdev) { 
    return Math.round((Math.random()*2-1)+(Math.random()*2-1)+(Math.random()*2-1))*stdev+mean); 
} 

//using the following values: 
{ 
    mean:400, 
    standard_deviation:1 
    //results in a range of 397-403, or +-range of 3 
}, 
{ 
    mean:400, 
    standard_deviation:10 
    //results in a range of 372-429, or +-range of 30 
}, 
{ 
    mean:400, 
    standard_deviation:25 
    //results in a range of 326-471, or +-range of 75 
} 

每一個給我一個範圍大約爲standard_deviation *(+ - 3)(假設我離開運行更長的程序)。

C.我可如下計算這個範圍:

  1. 假設我想從300-500的範圍內,所以無功TOTAL_RANGE = 200;
  2. 我的意思是400,我的+範圍是total_range/2(var r = 100)
  3. 因此standard_deviation將是r/3或在這種情況下是33.333。

這似乎是工作,但我不知道我的數學這樣做我覺得自己像個白癡,這個解決方案感到缺憾和不完全準確。

我的問題: 有沒有一些公式可以幫助我呢?我的要求如下:

  1. 必須能夠準確地定義一個數字範圍。
  2. 必須儘可能高效地在JavaScript中完成。

我想也許我很接近,但它不是那裏。

回答

19

扣除兩個隨機數不會給你一個正態分佈,它會給你在零兩邊線性下降的數字。見紅圖中這個小提琴:

http://jsfiddle.net/Guffa/tvt5K/

要獲得正態分佈的一個很好的近似,增加6張隨機數一起。看小提琴中的綠色圖。

因此,要獲得正態分佈的隨機數,使用:

((Math.random() + Math.random() + Math.random() + Math.random() + Math.random() + Math.random()) - 3)/3 

這種方法是基於中心極限定理,概括爲第二種方法在這裏:http://en.wikipedia.org/wiki/Normal_distribution#Generating_values_from_normal_distribution

+2

@jared:這只是數字足以讓逼近合理貼近實際的正態分佈。看到這個比較:http://en.wikipedia.org/wiki/File:Dice_sum_central_limit_theorem.svg其中原始代碼將對應於'n = 2' – Guffa

+0

謝謝! 所以這裏是如下的邏輯: http://jsfiddle.net/jareds/D6Nub/ 2,3,4,5,6,12隨機量 - 2,4,5,6都會產生類似的鐘形曲線..所以這些都是類似的鐘形曲線。我會繼續尋找,但我認爲這是我的答案。再次感謝。 – jared

+0

爲了得到一個N(0,1),你必須執行'* 2'而不是'/ 3',因爲[那個分佈]的方差(https://en.wikipedia.org/wiki/Irwin%E2%80% 93Hall_distribution)是「n/12」,即「n」是所添加的隨機數的數量。那麼如果你想要一個特定的標準偏差就乘以它。 – rodrigo

3

我想有高斯隨機0和1之間和之後many tests(感謝@Guffa回答太)我發現這個數字是最好的:

function gaussianRand() { 
    var rand = 0; 

    for (var i = 0; i < 6; i += 1) { 
    rand += Math.random(); 
    } 

    return rand/6; 
} 

作爲獎勵:

function gaussianRandom(start, end) { 
    return Math.floor(start + gaussianRand() * (end - start + 1)); 
} 
相關問題