【问题标题】:Probability of a sum S using X dice each with different Y faces使用具有不同 Y 面的 X 骰子的总和 S 的概率
【发布时间】: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

这很好用,但是,如前所述:

  1. 太丑了
  2. 数量有限。

【问题讨论】:

  • 这不是更适合Code Review吗?
  • 这个论坛的新手..我应该在那里重新发布吗?
  • 我不确定重新发布或迁移是否更好,也许其他人可以加入?
  • 由于此代码有效,因此更适合 Code Review。
  • 一个简单的骰子总和问题(没有皱纹,例如省略最少的两个骰子或只取最高的 3 个或类似的东西)简单而精确地等于代表每个概率的向量的卷积脸。向量的卷积是一个求和——正确处理它有点棘手,但不是太难。一旦你有了它,你就可以处理任意数量的骰子和任意数量的面(如果你愿意,每个面的概率不同)。我不为此推荐 VBA。你能用别的东西吗?如果没有,它仍然是可能的。希望这会有所帮助。

标签: excel vba probability


【解决方案1】:

自从我用 VBA 编程以来已经有几十年了,但你想做的是使用 Collection object。然后,您可以使用取决于骰子值的循环来迭代任意大小的骰子集合。

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

当你弄清楚所有这些时,你将成为一个更好的 VBA 程序员。但是,如果您曾经使用过更灵活的语言,例如 Python,您会很快发现这一切可以变得多么容易......

【讨论】:

  • 非常感谢.. 我会在接下来的几周内尝试找出你的答案?
猜你喜欢
  • 2015-07-03
  • 2016-07-08
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多