2013-04-01 53 views
2

假設我有一個範圍從1到10的值。我想根據某種高斯概率從這個範圍中隨機選擇一個數字。所以,有更大的機會獲得約4,5,6的值。仍有機會獲得1和10,但機會較小。它不需要嚴格遵循高斯分佈,因爲1和10的值幾乎幾乎不可能得到。我希望至少改變並歪曲獲得極端值的機會,同時擴大獲得其他價值的機會。通過傾斜,我的意思是可能有些時候我會希望得到10的機會超過1.因此,分佈可能不一定是對稱的。根據概率從一系列值中隨機挑選一個數字

我嘗試使用隨機類播種隨機浮點值並將值乘以10,但可能仍然是線性的。我想不出如何做到這一點。有沒有簡單的方法來實現這一點?

+0

這可能是相關的:http://stackoverflow.com/questions/218060/random-gaussian-variables –

+0

「C#高斯隨機」的第一個谷歌結果給了:[隨機高斯變量](http:// stackoverflow。 COM /問題/ 218060 /隨機高斯變量)。你嘗試過嗎? – publicgk

回答

2

在C#中,來自Random的值具有均勻分佈,因此將它們乘以某個常數就會簡單地改變值的範圍。

但是,使用Box-Muller變換,您可以使用兩個均勻的隨機變量創建高斯分佈。

查看this question的實現答案。

+0

也許我應該讓自己的問題更清楚。我並不是真的在尋找一個精確的高斯分佈。高斯分佈是對稱的。我希望我可以讓分配有時偏向一邊或另一邊。 – Carven

+0

@Carven這當然是可能的。您需要確定您想要的內容以及如何創建一個算法,以基於一定數量的均勻分佈的輸入值生成此類分佈。確切的實施將取決於您想要的分銷細節。 – Servy

1

這可能幫助你:

應用您的概率函數值1到10然後你得到它們的頻率。現在創建一個數組,每個數值從1到10,每個數值根據其頻率重複。 e.g:

int[] values = { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 10 }; 

現在你可以使用一個變量Random 0和values.Length之間得到一個數(指數)。最後返回值[index]。

+1

預先計算這樣的查找對於分佈函數是非常有效的,當它們應用於的範圍既是靜態的又是小的時候,分佈函數並不複雜。如果任何這些斷言不適用(我懷疑他們都這樣做),那麼這不是一個實際的解決方案。 – Servy