我正在尝试在VBA中编写代码,该代码返回使总和S滚动每个带有Y边的X骰子的概率(例如:滚动1个六面骰子+ 2个八面骰子+ 2个四面骰子)。
鉴于我对VBA的不良经验和知识,我编写了一个覆盖X <= 5的丑陋代码;我想要获得的是找到一种使用任意大X的更简单,更好,更优化的方法。
这是我的代码:
Sub Somma()
Dim dado1, dado2, dado3, dado4, dado5 As Integer
Dim inp As Double
Dim prob As Long
som = Sheets("Prob").Range("d11").Value
'set each variable to each die's sides
dado1 = Sheets("Prob").Range("d2").Value
dado2 = Sheets("Prob").Range("d3").Value
dado3 = Sheets("Prob").Range("d4").Value
dado4 = Sheets("Prob").Range("d5").Value
dado5 = Sheets("Prob").Range("d6").Value
prob = 0
If Sheets("Prob").Range("d7").Value = 2 Then 'how many dice are used
For d1 = 1 To dado1
For d2 = 1 To dado2
If d1 + d2 >= inp Then prob = prob + 1
Next d2
Next d1
Sheets("Prob").Range("d14").Value = prob
Else
If Sheets("Prob").Range("d7").Value = 3 Then
For d1 = 1 To dado1
For d2 = 1 To dado2
For d3 = 1 To dado3
If d1 + d2 + d3 >= inp Then prob = prob + 1
Next d3
Next d2
Next d1
Sheets("Prob").Range("d14").Value = prob
Else
If Sheets("Prob").Range("d7").Value = 4 Then
For d1 = 1 To dado1
For d2 = 1 To dado2
For d3 = 1 To dado3
For d4 = 1 To dado4
If d1 + d2 + d3 + d4 >= inp Then prob = prob + 1
Next d4
Next d3
Next d2
Next d1
Sheets("Prob").Range("d14").Value = prob
Else
For d1 = 1 To dado1
For d2 = 1 To dado2
For d3 = 1 To dado3
For d4 = 1 To dado4
For d5 = 1 To dado5
If d1 + d2 + d3 + d4 + d5 >= inp Then prob = prob + 1
Next d5
Next d4
Next d3
Next d2
Next d1
Sheets("Prob").Range("d14").Value = prob
End If
End If
End If
End Sub
这非常有效,但是,如前所述:
答案 0 :(得分:0)
自从我在VBA中编程以来已有数十年了,但是您要做的是使用Collection object。然后,您可以遍历任意大小的骰子集合,并根据骰子的值进行循环。
要棘手的是跟踪概率。您可以定义一个函数,该函数返回一个变体,然后返回一个Double
数组。您可以使用ReDim将其初始化为正确的大小。
当您弄清所有这些时,您将成为更好的VBA程序员。但是,如果您曾经使用像Python这样的更灵活的语言,那么您会很快发现这一切都容易得多...