【问题标题】:Excel VBA Powerful Random Number GeneratorExcel VBA 强大的随机数生成器
【发布时间】:2025-12-30 08:30:05
【问题描述】:

我会尽量保持基本和重点。

基本上,我有与某个数字范围相关的权重/概率。例如:

0:10%

1:50%

2:15%

3:25%

这会转化为累积概率:

0:10%

1:60%

2:75%

3:100%

在 VBA 中使用统一的 RNG,程序会生成介于 0 和 1 之间的数字,或者它设置的任何下限。使用与上一个示例相同的值,但只生成大于 60%(和

这就是我卡住的地方。我需要将这些随机数非常有效地转换为它们的“对应值”。

所有这些都存储在 VBA 变量中,不用说,我不想为每种情况编写 Select Case,因为它们实际上是 120 个不同的变量和权重。

截至目前,这是我必须生成这些数字的:

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

感谢您的所有帮助!如果我错过了讨论此特定问题的帖子,请随时向我推荐,但我确实没有找到与相应随机数相关的任何内容。

【问题讨论】:

  • 您能提供更多信息吗?您可以使用For... Next 循环来执行此操作。获得随机数后,循环遍历包含 120 个不同变量和权重的表以找到匹配项并输出您需要的 Range.Offset() 答案。
  • 您的值和权重是如何存储的:作为单元格还是在 VBA 结构中,如数组或集合?

标签: vba excel random


【解决方案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

【讨论】:

  • 正是我所寻找的,我已经看到了一些这样的数组公式,但不知道如何最好地遍历我的值并分配权重和累积权重。非常感谢!