2016-07-29 386 views
4

我想在C#中編寫一個隨機數生成器函數,這個函數需要最小值,最大值權值參數。如何用C#中的權重編寫隨機數生成器?

對於權重== 0,結果將等於最小值,並且權重== 1時,結果將等於最大值。在體重== 0.5的情況下,範圍內的所有數字都有相同的選擇機會。

我想達到的效果是隨着體重接近最小值,最小值有更多的機會被選中,最大值減小,反之亦然。

+2

@Plutonix有幾種不同的分佈可以考慮,你似乎只考慮均勻分佈 –

+2

有很多不同的方法可以解決這個問題,你可以舉幾個例子來說明函數應該如何處理0.1,0.25,0.66等權重。 ? –

+0

我無法確定其他權重產生的確切值,例如,如果權重爲0.1,則最小值的概率爲90%,最大值爲10%,值i n之間將被相應地分配。但是,我不確定所有概率的總和是否應該超過100%,就像那樣。 –

回答

0

這是一個從可能性無限數量從[0, 1]獲得加權值:

Random rnd = new Random(); 
double weight = ...; // must be in [0, 1]; 

double r = rnd.NextDouble(); 
if (weight < 0.5) 
    val = 1 - Math.Pow(r, weight * 2); 
else 
    val = Math.Pow(r, (1 - weight) * 2); 

它可以映射到[min, max]作爲

double val2 = val * (max - min) + min; 
+0

這是錯誤的,你的體重不僅影響概率,而且還影響幅度 –

+0

@SeverinPappadeux哎呀,謝謝!希望更正:)。 – AlexD

15

我有一個簡短的教程描述如何做到這一點這裏:

https://ericlippert.com/2012/02/21/generating-random-non-uniform-data/

摘要:

  • 國家通過你的權重參數參數的功能,使該概率分佈函數
  • 使用微積分來集成該函數以獲得累積分佈函數
  • 將該函數反轉以獲取分位數函數
  • 實現分位數函數,並將均勻分佈的隨機源的輸出傳遞給分位數函數。結果將是一個符合期望分佈的隨機源。
  • 將該函數轉換爲整數範圍,並適當地舍入。
+0

這需要我花一些時間,但從粗略的角度來看,這似乎是我需要的。謝謝。 –

0

我的建議是使用Beta distribution,找到你的體重的功能,導致所需的行爲。

例如,假設支持介於0和1之間,並且權重$ w $也在0和1之間。Beta有兩個參數,$ \ alpha $和$ \ beta $。假設$ \ alpha = 2 * w $和$ \ beta = -wlog_2(w) - (1-w)* log_2(1-2)$(恰好是binary entropy function),那麼Beta對於權重0和1,一個0.5的權重標準統一,並給出其他權重值的有效連續分佈,Beta的這種特殊的重新參數化可能並不完全是你想要的,但你可以玩類似的功能。