来自动态数组的概率随机选择

问题描述 投票:1回答:1

我是VBA的新手。我有2个列表,一个价格列表和一个分配给该价格的概率列表。我需要根据概率组生成300个数字的列表。但是,我似乎无法正常工作。我从另一篇文章中摘录了代码:

Function RandItem(items As Variant, probs As Variant) As Variant
    Dim i As Long, sum As Double
    Dim spin As Double

    spin = Rnd()
    For i = LBound(probs) To UBound(probs)
        sum = sum + probs(i)
        If spin <= sum Then
            RandItem = items(i)
            Exit Function
        End If
    Next i
    'if you get here:
    RandItem = items(UBound(probs))
End Function

还有

Sub test()
    Randomize
    Dim i As Long, v As Variant
    ReDim v(1 To 50)
    For i = 1 To 50
        v(i) = RandItem(Array(1, 2, 3, 4, 5), Array(0.26, 0.18, 0.26, 0.2, 0.1))
    Next i
    Debug.Print Join(v)
End Sub

以适应我的代码。但是,问题在于价格范围会扩大,并且概率会随时间而变化(由于历史权重)。所以我试图切换:

RandItem(Array(1, 2, 3, 4, 5), Array(0.26, 0.18, 0.26, 0.2, 0.1))

to

Dim i As Long, v As Variant
Dim LastRow As Long
Dim arrayPrice As Variant
Dim arrayProPrice As Variant
LastRow = Cells(Rows.Count, "A").End(xlUp).Row
arrayPrice = Range("A2:A" & LastRow).Value2
arrayProPrice = Range("B2:B" & LastRow).Value2
ReDim v(1 To 300)
    For i = 1 To 300
        v(i) = RandItem(arrayPrice, arrayProPrice)
    Next i
    Debug.Print Join(v)
End Sub

它返回:运行时错误“ 9”:下标超出范围。任何人都对如何解决此问题有任何建议,因此我可以使用数组变量而不是列出所有价格范围?

学分:Generating numbers with certain probabilities visual basics vba

arrays excel vba random probability
1个回答
0
投票

您的动态解决方案不起作用,因为arrayPricearrayProPrice不是一维数组,正如[C​​0]期望的那样,而是二维数组。这是因为Excel Ranges通常可以具有多行多列,因此RandItem.Value2方法返回一个矩阵。

例如,如果您在Excel工作表中具有A2 = 1,A3 = 2和A4 = 3,则.Value将为arrayPrice

在调用Array(Array(1), Array(2), Array(3))之前,您首先必须将该矩阵展平为一维数组。 RandItem也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.