Arrays 动态阵列的概率随机选择

Arrays 动态阵列的概率随机选择,arrays,excel,vba,random,probability,Arrays,Excel,Vba,Random,Probability,我是这里的VBA新手。我有两个列表,一个价格列表,和一个分配给价格的概率列表。我需要根据概率组生成一个包含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 = LBou

我是这里的VBA新手。我有两个列表,一个价格列表,和一个分配给价格的概率列表。我需要根据概率组生成一个包含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
以适应我的代码。然而,问题是价格区间在增长,概率随时间而变化(由于历史权重)。因此,我尝试切换:

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

它返回: 运行时错误“9”: 下标超出范围。有没有人建议如何解决这个问题,这样我就可以使用数组变量,而不是列出所有的价格范围

学分:
您的动态解决方案不起作用,因为
arrayPrice
arrayPrice
不是
RandItem
所期望的一维数组,而是二维数组。这是因为Excel范围通常可以有多行多列,因此
.Value2
.Value
方法返回一个矩阵

例如,如果在Excel工作表中有A2=1、A3=2和A4=3,则
arrayPrice
将是
Array(Array(1)、Array(2)、Array(3))

在调用
RandItem
之前,首先必须将该矩阵展平为一维数组。这同样适用于
arrayProPrice

您可以使用Excel函数来实现这一点:

arrayPrice = Application.Transpose(Range("A2:A" & LastRow))
arrayProPrice = Application.Transpose(Range("B2:B" & LastRow))

动态解决方案不起作用,因为
arrayPrice
arrayProPrice
不是
RandItem
所期望的一维数组,而是二维数组。这是因为Excel范围通常可以有多行多列,因此
.Value2
.Value
方法返回一个矩阵

例如,如果在Excel工作表中有A2=1、A3=2和A4=3,则
arrayPrice
将是
Array(Array(1)、Array(2)、Array(3))

在调用
RandItem
之前,首先必须将该矩阵展平为一维数组。这同样适用于
arrayProPrice

您可以使用Excel函数来实现这一点:

arrayPrice = Application.Transpose(Range("A2:A" & LastRow))
arrayProPrice = Application.Transpose(Range("B2:B" & LastRow))

我明白了,这的确是一个伟大的洞察力!如果我可以进一步问的话,我该怎么做呢?我明白了,这的确是一个伟大的见解!如果我可以进一步问的话,我该怎么做?
arrayPrice = Application.Transpose(Range("A2:A" & LastRow))
arrayProPrice = Application.Transpose(Range("B2:B" & LastRow))