我会尝试将此作为基本和尽可能保持这一点。
基本上,我有一定数量范围的权重/概率。例如:
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之间。
这就是我被困的地方。我需要非常有效地将这些随机数转换为相应的值&#34;。
所有这些都存储在VBA变量中,不用说,我不想为每种情况编写一个Select Case,因为它们实际上有120个不同的变量和权重。
截至目前,我必须生成这些数字:
RandomNumber = LowerLimit + Rnd() * (1 - LowerLimit)
感谢所有人的帮助!如果我错过了一个讨论这个特定问题的帖子,请随时转介给我,但我真的没有找到任何与相应随机数有关的内容。
答案 0 :(得分: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