2011-12-03 26 views
1

我想生成一個接近於零的數字,並且有一定的一般範圍。例如,假設我希望這個數字在10%到90%的時間內下降,但是有一個很小的可能性,那就是15,20,甚至30個。數字越高,收到的機會就越小。如何生成一個接近零的隨機數?

我試過尋找的東西與關鍵字「加權概率」,但找不到任何東西導致正確的方向。


更新:

我最終使用的箱穆勒變換(見接受的答案)。這裏是我寫的簡單代碼:

const E = 2.71828183; 

function getRandomCurvedValue(temp.median, temp.density) { 
    return this.getCurvedValue(random(0, 1), temp.median, temp.density); 
} 

function getCurvedValue(temp.value, temp.median, temp.density) { 
    return temp.median + (temp.density * log(E, (temp.value/(1 - temp.value)))); 
} 
+0

您是否正在生成整數? http://stackoverflow.com/questions/1761626/weighted-random-numbers。 -10是一個有效的輸出? –

+0

你必須更具體,最有可能的選擇一個合適的'pdf'。 – AraK

+0

你想如何分配你的號碼?是唯一的要求,它是在10 90%的時間內? – James

回答

5

我認爲您正在尋找一個normal distribution

正態分佈有兩個變量,您可以更改:均值和標準差。在你的情況下,平均值爲0,適當選擇標準偏差以使90%的值降到10以下。(根據維基百科文章中的表格,我認爲1.645的標準偏差是合適的。)

你可以使用Box-Muller transform作爲從均勻分佈的隨機值生成正態分佈隨機值的簡單方法。你也需要使用結果的絕對值,因爲你只需要在[0,∞)範圍內的值。

+0

這是完美的,謝謝!我已經將我用過的代碼添加到了我的問題的末尾。 –

+0

不錯的答案;很棒的圖表。 – duffymo

0

一種可能性是生成一組隨機數(對於每次迭代)。這些數字中的最小值被選爲您生成的數字。

顯然,您選擇的數字越多,您就越有可能擁有更小的最小數量。

示例:假設您在您的設置中生成了兩個隨機數,分別爲9和10.因爲它是最小的,所以選擇了9。

假設您在您的設置中生成了四個隨機數,分別爲9,10,11和8.選擇8,因爲它是您最小的。

而且用這種方法,它是你必須從中挑選數的範圍內重要的是,從1到100說...(這是不大不小的限制因素)

3

如果我理解你的權利,你只需要正數的隨機數。在這種情況下,您可以使用例如exponentially distributed random numbers。這個分配有一個參數lambda。如果你「希望數字低於10 90%」,那麼lambda可以計算爲-ln(0.1)/10(這裏的ln是自然對數)。一般來說,如果你希望它以概率p下降到x以下,那麼lambda = -ln(1 - p)/x(在你的例子中,p = 0.9和x = 10)。您可以使用此公式輕鬆生成具有給定lambda參數的指數分佈隨機數:-ln(1 - rand())/lambda,其中函數rand()是可以生成介於0和1之間的均等分佈的隨機數的函數。

+0

的確,指數作品也是如此。 – Joey