2014-11-17 16 views
0

我會盡量保持這一點儘可能基本和重點。Excel VBA強大的隨機數發生器

基本上,我有與一定範圍的數字相關的權重/概率。例如:

0:10%

1:50%

2:15%

3:25%

然後,這轉換成累積概率:

0:10%

1:60%

2:75%

3:100%

使用在VBA均勻RNG,程序0和1,或任何劣質限制它被設置爲生成之間的數字。使用與前面的示例相同的值,但只生成大於60%(和< = 100%)的數字,這會導致數字在0.6 - 1.0之間。

這是我卡住的地方。我需要將這些隨機數非常有效地轉換爲它們的「相應值」。

它全部存儲在VBA變量中,不用說,我不想爲每種情況寫一個Select Case,因爲它們實際上是120個不同的變量和權重。

截至目前,這是我不得不產生那些數字:

RandomNumber = LowerLimit + Rnd() * (1 - LowerLimit) 

由於是提前爲您的幫助!如果我錯過了一篇討論這個特定問題的帖子,請隨時向我介紹它,但我確實沒有發現任何與相應的隨機數有關的內容。

+0

你能提供更多的信息嗎?你可以用'For ... Next'循環來做到這一點。一旦你有了你的隨機數,循環遍歷一個包含120個不同變量和權重的表,找到匹配並輸出你需要的'Range.Offset()'答案。 – Chrismas007

+0

你的值和權重是如何存儲的:作爲單元格還是像數組或集合這樣的VBA結構? – Blackhawk

回答

1

將以下函數放入公共模塊中。你可以這麼稱呼它,如mynumber = WeightedRnd(Array(0, 1, 2, 3), Array(0.1, 0.5, 0.15, 0.25))

Public Function WeightedRnd(values As Variant, weights As Variant) As Double 
    'First, calculate the cumulative weights 
    Dim cumulativeWeight As Double 

    For i = 0 To UBound(weights) 
     weights(i) = weights(i) + cumulativeWeight 
     cumulativeWeight = weights(i) 
    Next 

    'Next, generate our random number 
    Dim randomNumber As Double 
    randomNumber = Rnd() 

    'Finally, figure out which "bucket" it falls into 
    For i = 0 To UBound(weights) 
     If randomNumber <= weights(i) Then 
      WeightedRnd = values(i) 
      Exit Function 
     End If 
    Next 
End Function 
+0

準確地說,我在找什麼,我看到過這些數組公式,但不知道如何最好地循環訪問我的值並分配權重和累積權重。 非常感謝! – pettiblay