高级会员
- UID
- 4648121
- 积分
- 1236
- 可用积分
- 点
- 威望
- 个
- 水滴
- 滴
- 存在感
- 点
- NB
- 点
- 豆币
- 点
- 帖子
- 主题
- 好友
- 精华
- APP积分
- 点
|
楼主 |
2025-1-13 17:18 发表于 上海
来自移动设备
|
显示全部楼层
Function SimulateBalls(numBalls As Integer, numDistinct As Integer, targetProbability As Double, numSimulations As Long) As Variant
' 声明变量
Dim i As Long, j As Long
Dim balls() As Integer
Dim distinctCount As Integer
Dim draws As Long
Dim totalDraws As Long
Dim successCount As Long
Dim probabilityReached As Boolean
Dim drawsForProbability As Long
' 初始化变量
ReDim balls(1 To numBalls)
totalDraws = 0
successCount = 0
probabilityReached = False
drawsForProbability = 0
' 进行模拟
For i = 1 To numSimulations
ReDim distinctBalls(1 To numBalls) As Boolean ' 用于记录已抽到的不同小球
distinctCount = 0
draws = 0
Do While distinctCount < numDistinct
draws = draws + 1
j = Int(Rnd() * numBalls) + 1 ' 随机抽取一个小球
If Not distinctBalls(j) Then
distinctBalls(j) = True
distinctCount = distinctCount + 1
End If
Loop
totalDraws = totalDraws + draws
' 检查是否达到目标概率
If distinctCount >= numDistinct Then
If Not probabilityReached Then ' 只记录第一次达到概率的抽取次数
If successCount / i >= targetProbability Then
drawsForProbability = draws
probabilityReached = True
End If
End If
successCount = successCount + 1
End If
Next i
' 计算平均抽取次数
Dim averageDraws As Double
averageDraws = totalDraws / numSimulations
' 将结果以数组形式返回
Dim results(1 To 2) As Variant
results(1) = averageDraws
If probabilityReached Then
results(2) = drawsForProbability
Else
results(2) = "未达到指定概率"
End If
SimulateBalls = results
End Function
Sub TestSimulateBalls()
Dim numBalls As Integer
Dim numDistinct As Integer
Dim targetProbability As Double
Dim numSimulations As Long
Dim results As Variant
numBalls = 11
numDistinct = 9
targetProbability = 0.8 ' 80%
numSimulations = 10000 ' 模拟次数,越多越精确
results = SimulateBalls(numBalls, numDistinct, targetProbability, numSimulations)
Debug.Print "模拟次数: " & numSimulations
Debug.Print "平均抽取次数 (达到 " & numDistinct & " 个不同小球): " & results(1)
Debug.Print "达到 " & targetProbability * 100 & "% 概率 (至少 " & numDistinct & " 个不同小球) 的抽取次数: " & results(2)
numDistinct = 11
results = SimulateBalls(numBalls, numDistinct, targetProbability, numSimulations)
Debug.Print "平均抽取次数 (达到 " & numDistinct & " 个不同小球): " & results(1)
Debug.Print "达到 " & targetProbability * 100 & "% 概率 (至少 " & numDistinct & " 个不同小球) 的抽取次数: " & results(2)
End Sub |
|