vba - 生成具有一定概率的数字视觉基础vba

标签 vba random probability

我有一些可能性

26% 18% 26% 20% 10%

我想根据概率组生成一些数字(在一定范围内随机)。

我之前已经以 80% 和 20% 的 2 个概率做到了这一点,如下所示:

If rnd*100 < 80 then Output = 2 
Else  output = 10
End if

但我不知道如何在超过 2 个概率的情况下做到这一点!

最佳答案

生成 [0,1] 范围内的随机数。开始添加概率(0.26、0.18 等),直到超过所选数字。一旦发生这种情况 - 选择范围内相应的数字。

以下函数传递两个数组(假设长度相同)。第一个包含要从中采样的项目范围(不必是数字),第二个数组是相应的概率:

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

典型输出:

2 4 2 1 1 4 3 4 2 3 2 4 5 1 1 3 3 4 3 3 3 4 4 2 4 4 1 2 3 1 2 3 5 2 3 4 5 2 3 2 3 4 1 1 1 2 1 4 3 2

这是一个条形图,显示 1000 个随机选择(使用相同的 5 个概率):

enter image description here

正如您所看到的,它很好地匹配了目标概率。

关于vba - 生成具有一定概率的数字视觉基础vba,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37356179/

相关文章:

excel - VBA 和私有(private)函数

excel - VBA Excel 中的 VBA DateValue() 错误?

java - 递归循环

SQL 字符串太长

vba - 根据单元格中的值对单元格进行颜色

r - `rbinom()` 中可能存在大量试验的错误

java - 在 Java 中获取 0 到 0.06 之间的随机数?

c# - NSubstitute 模拟扩展方法

mysql - 从 MySQL 中选择随机行(有概率)

java - 不同类型骰子的骰子总和概率