2011-10-03 69 views
1

我一直在爲此尋找答案,但是我發現的所有討論都是用我不懂的語言,或者依賴於每個元素都有自己的權重的集合。加權隨機數生成C#

我想基本上只是得到一個0到10之間的隨機數,這是「中等加權」,因爲在5中比0和10多出現。基本上我一直在試圖找出一個算法,我可以給任何數字都是我定義的最小和最大值之間的「加權數字」,並且所有生成的數字將被適當加權。我知道這可能聽起來像「我不想考慮這件事,我只是坐下來等待別人這樣做」,但我一直在思考和尋找這個問題一個小時,我真的很失落:|那麼到底

,我想我可以打電話(通過擴展方法)

random.NextWeighted(MIN, MAX, WEIGHT); 
+1

重量是多少?多頻繁?你想要[正常分配](http://en.wikipedia.org/wiki/Normal_distribution)嗎? –

+1

我們首先假設你想要數字從零到九,所以有十種可能性。如果您繪製了一百萬個常規RNG運行的直方圖,則預計在直方圖的每一列中會有十萬個點擊。你能描述一下你的*期望的*直方圖看起來像細節*嗎? –

+0

您必須首先找出所需的[概率分佈](http://en.wikipedia.org/wiki/Probability_distribution)。 –

回答

5

你有一個inverse normal distribution method可用。

  1. 縮放您的隨機數,使它成爲零與一之間的雙倍數。

  2. 將它傳遞給InverseNormalDistribution。

  3. 根據重量縮放返回值。 (例如,除以重量超過100)

  4. 計算[(MIN + MAX)/ 2] + [(ScaledValue)X(MAX - MIN)]

  5. 如果這是小於MIN,返回MIN。如果它大於MAX,則返回MAX。否則,返回這個值。

4

我不知道你想要5出現多少比0-10之間的其他數字,但你可以創建一個數組與你想要的分佈。

喜歡的東西

var dist = new []{0,1,2,3,4,5,6,7,8,9,10,5,5,5}; 

然後你得到的0和13的隨機位置,你會0-10,但有5四倍之間得到的數字往往比其他人。如果你想要0到10億的數字,但速度相當快但不太實用。

+0

那麼,通過索引從數組中獲取值也可以。 –

+0

你是絕對正確的,字典是沒有必要的。 –

+0

這麼簡單而有效! –