使用X骰子且每个Y面不同的和S的概率

时间:2019-03-29 11:54:43

标签: excel vba probability

我正在尝试在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

这非常有效,但是,如前所述:

  1. 丑陋
  2. 数量有限。

1 个答案:

答案 0 :(得分:0)

自从我在VBA中编程以来已有数十年了,但是您要做的是使用Collection object。然后,您可以遍历任意大小的骰子集合,并根据骰子的值进行循环。

要棘手的是跟踪概率。您可以定义一个函数,该函数返回一个变体,然后返回一个Double数组。您可以使用ReDim将其初始化为正确的大小。

当您弄清所有这些时,您将成为更好的VBA程序员。但是,如果您曾经使用像Python这样的更灵活的语言,那么您会很快发现这一切都容易得多...