Вероятность суммы S с использованием X кубиков, каждый с разными гранями Y - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь написать код в VBA, который возвращает вероятность получения суммы S, бросающей X кубиков, каждая с Y сторонами (например, бросая 1 шестигранный кубик + 2 восьмигранных кубика + 2 четырехсторонних кубика ).

Учитывая мой плохой опыт и знания VBA, я написал некрасивый код, который охватывает X <= 5; что я хотел бы получить, так это найти более простой, лучший и более оптимизированный способ использования произвольно большого X. </p>

Вот мой код:

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 голосов
/ 30 марта 2019

Прошло несколько десятилетий с тех пор, как я программировал на VBA, но вы хотите использовать объект Collection .Затем вы можете перебирать коллекцию кубиков любого размера с циклами, которые зависят от значений кубиков.

Что будет сложнее, это отслеживать вероятности.Вы можете определить функцию, которая возвращает вариант, а затем вернуть массив Double.Который вы можете инициализировать до нужного размера с помощью ReDim .

К тому времени, когда вы все это поймете, вы станете лучшим программистом VBA.Однако, если вам когда-нибудь удастся использовать более гибкий язык, такой как Python, вы быстро узнаете, насколько проще все это может быть ...

...