2012-11-23 89 views
0

使用隨機庫,這些功能:隨機函數,計算百分比

randomChance(p) Returns true with the probability indicated by p.

randomInteger(low, high) Returns a random integer in the range low to high, inclusive.

什麼是貫徹落實「隨機選擇」這需要考慮比例的最簡單的方法,1/4或1/3等...我有一個鍵/值配對陣列。例如,"a" migth的值爲2,"b"的值爲2. 1/2。

最大值將是數組的大小,因爲它只包含唯一項目。 randomChance()函數的範圍在0.0 - 1.0之間,其中1 = 100%。如果我的數組大小是4,什麼是「讓4是1」的最佳方式。

+1

我不明白你在問什麼。這個「1/4或1/3等」比例是什麼? – melpomene

+0

四分之一的100%= 25% –

回答

1

比方說你有:

a = 2, b = 2, c = 1, d = 3 

現在使它:

a = 2, b = 4, c = 5, d = 8 

從1創建一個隨機數MaxVal最大值(最後一個鍵,8個在這個例子中的值)。選擇其中value> = RandomNum

編輯

我做了一個小VB.Net說明了算法和它是如何工作的第一重點。該代碼並不意味着:優秀,優雅,高性能或可讀。

Module Module1 

    Private Class Value 
     Public vOrg, vRecalc, HitCount As Integer 
     Public Key As String 
     Public Sub New(s, v1, v2, c) 
      Key = s : vOrg = v1 : vRecalc = v2 : HitCount = c 
     End Sub 
    End Class 

    Sub Main() 

     ' set initial values 
     Dim KVP() As Value = {New Value("A", 2, 0, 0), 
           New Value("B", 2, 0, 0), 
           New Value("C", 1, 0, 0), 
           New Value("D", 3, 0, 0)} 
     ' recalc values 
     For i = 0 To KVP.Length - 1 
      If i = 0 Then KVP(0).vRecalc = KVP(0).vOrg Else KVP(i).vRecalc = KVP(i).vOrg + KVP(i - 1).vRecalc 
     Next 
     ' do test 
     Dim r As New Random 
     Dim runs As Integer = 1000 * 1000, maxval As Integer = KVP(KVP.Length - 1).vRecalc 
     For i = 1 To runs 
      Dim RandVal = r.Next(1, maxval + 1) 
      Dim chosen As Integer = (From j In Enumerable.Range(0, KVP.Length) Where KVP(j).vRecalc >= RandVal Take 1 Select j)(0) 
      KVP(chosen).HitCount += 1 
     Next 
     ' ouput results 
     For Each kv In KVP 
      Console.WriteLine("{0} was chosen with {1:F3} propability, expected was {2:F3}", kv.Key, kv.HitCount/CDbl(runs), kv.vOrg/CDbl(maxval)) 
     Next 

     Console.ReadLine() 

    End Sub 

End Module 

輸出採樣:

A was chosen with 0.250 propability, expected was 0.250 
B was chosen with 0.251 propability, expected was 0.250 
C was chosen with 0.124 propability, expected was 0.125 
D was chosen with 0.375 propability, expected was 0.375 
+0

這很簡單,很少代碼,我喜歡它。但是,對於maxVal,如果我是正確的,那必須是所有值a,b,c,d(2 + 2 + 1 + 3)的總和。我是否正確,我的數學技能是否讓人尷尬? –

+1

MaxVal是最後一個鍵的值(重新計算後) – igrimpe

+0

@igrimpe:你的解決方案是完全錯誤的:「c」將以概率4/8選取,這是錯誤的(應該是1/8) –

1

只是乘以randomChance()結果和數組長度在一起。它會給你指數範圍在[0,array_length-1],您可以使用訪問數組

array_index = (unsigned int)(randomChance(p) * (array_length - 1)); 

也許你的意思是「讓3爲1」(而不是4)在你的榜樣。長度爲4的數組的最後一個索引是3.

+0

好的解決方案,但只適用於平均分配的密鑰(每個密鑰的機會相同)。當然你可以簡單地創建一個從0到maxindex的隨機數。 – igrimpe

+0

使它不均勻只是重複多次數組中的值或使randomChange()本身成爲非均勻函數 –

+0

'重複多次' - 我不喜歡冗餘;) – igrimpe