我正在VBA中进行赌博模拟,以确定赢/输概率的变化将如何影响我的结果的标准偏差。在运行我的代码几次后,我注意到我的Else参数被跳过,因此numtries总是等于1. Fail,win和tryagain都表示总和为1的数字(失败< 1,失败+胜利< 1,失败+赢+ TRYAGAIN = 1)
这是我的代码。
Sub game()
Dim win, tryagain, prize, fail, numtries, winnings, roll As Integer
prize = Sheets("Game 1").Cells(3, 1).Value
win = Sheets("Game 1").Cells(5, 1).Value
tryagain = Sheets("Game 1").Cells(7, 1).Value
fail = Sheets("Game 1").Cells(9, 1).Value
winnings = 0
numtries = 1
For i = 1 To 9999
roll = Rnd()
If roll <= fail Then
winnings = 0
Exit For
ElseIf fail <= roll <= fail + win Then
winnings = prize * numtries
Exit For
Else
numtries = numtries + 1
End If
Next i
Sheets("Game 1").Cells(15, 3).Value = winnings
Sheets("Game 1").Cells(15, 4).Value = numtries
End Sub
谢谢!
答案 0 :(得分:2)
您可以通过调试应用程序找到此信息(使用F8键逐步执行VBA代码)。对于调试帮助,您真的应该为代码中的所有变量指定值,您正在使用的值以及您认为正确输出应该的值,以及输出您他们正在接受。这是其他人可以验证您的代码并确定正确的方法。
您将roll
定义为整数,然后设置roll=Rnd()
,但Rnd()
为float
并返回小于1的数字。这有效地表示roll=1
一直以来。
我怀疑fail
被定义为百分比(或十进制),它是&lt;这意味着你的状况
If roll <= fail
始终为FALSE
和
fail <= roll <= fail + win
始终为TRUE
。
其他问题,你应该可以从这里解决。这有帮助吗?
<强>更新强>
这是一个实现和一个辅助函数,它使事情变得更加清晰。特别是,for i=1 to 9999
循环已被激活,因为之前没有运行(设置runs
以更改循环次数)。
第一个子函数是辅助函数PrintArray
,用于将数组的内容打印到工作表。将两个程序复制到您的VBA中。
Sub PrintArray(Data As Variant, Cl As Range)
Cl.Resize(UBound(Data, 1), UBound(Data, 2)) = Data
End Sub
game2()
是对您的代码的轻微更新:
Sub game2()
Dim win, tryagain, prize, fail, winnings, roll As Double
Dim ans() As Double
Dim numtries, runs As Long
'set variables start
prize = Sheets("Game 1").Cells(3, 1).Value
win = Sheets("Game 1").Cells(5, 1).Value
tryagain = Sheets("Game 1").Cells(7, 1).Value
fail = Sheets("Game 1").Cells(9, 1).Value
runs = 99 'the number of loops
'set variables finish
ReDim ans(runs, 2)
winnings = 0
numtries = 1
For i = 1 To runs
roll = Rnd()
Select Case roll
Case 0 To fail
winnings = 0
Case fail To (fail + win)
winnings = prize * numtries
Case Else
numtries = numtries + 1 'numtries only gets updated here..
End Select
ans(i - 1, 0) = winnings
ans(i - 1, 1) = numtries
Next i
PrintArray ans, ActiveWorkbook.Worksheets("Game 1").[C15]
End Sub