【发布时间】:2019-03-30 07:30:02
【问题描述】:
我正在尝试在 VBA 中编写一个代码,它返回获得总和的概率 S 滚动 X 骰子,每个骰子都有 Y 面(例如:滚动 1 个六面骰子 + 2 个八面骰子 + 2 个四面骰子)。
鉴于我对 VBA 的糟糕经验和知识,我编写了一个包含 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
这很好用,但是,如前所述:
- 太丑了
- 数量有限。
【问题讨论】:
-
这不是更适合Code Review吗?
-
这个论坛的新手..我应该在那里重新发布吗?
-
我不确定重新发布或迁移是否更好,也许其他人可以加入?
-
由于此代码有效,因此更适合 Code Review。
-
一个简单的骰子总和问题(没有皱纹,例如省略最少的两个骰子或只取最高的 3 个或类似的东西)简单而精确地等于代表每个概率的向量的卷积脸。向量的卷积是一个求和——正确处理它有点棘手,但不是太难。一旦你有了它,你就可以处理任意数量的骰子和任意数量的面(如果你愿意,每个面的概率不同)。我不为此推荐 VBA。你能用别的东西吗?如果没有,它仍然是可能的。希望这会有所帮助。
标签: excel vba probability