Excel VBA强大的随机数生成器

时间:2014-11-17 15:41:01

标签: excel vba excel-vba random

我会尝试将此作为基本和尽可能保持这一点。

基本上,我有一定数量范围的权重/概率。例如:

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)

感谢所有人的帮助!如果我错过了一个讨论这个特定问题的帖子,请随时转介给我,但我真的没有找到任何与相应随机数有关的内容。

1 个答案:

答案 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