Полагаю, проблема в том, чтобы найти распределение суммы костей. Эффективный способ сделать это с помощью дискретной свертки. Распределением суммы переменных является свертка их вероятностных массовых функций (или плотностей в непрерывном случае). Convolution - это n-арный оператор, так что вы можете удобно вычислять его только по двум pmf за раз (текущее распределение итогов и следующий в списке). Затем из окончательного результата вы можете считать вероятности для каждой возможной суммы. Первый элемент в результате - это вероятность наименьшего возможного итога, а последний элемент - это вероятность наименьшего возможного итога. В промежутке между ними вы можете выяснить, какая из них соответствует конкретной сумме, которую вы ищете.
Трудная часть этого процесса - свертка, поэтому сначала поработайте над этим. Это просто простое суммирование, но немного сложно получить правильные пределы суммирования. Мой совет - работать с целыми или рациональными числами, чтобы вы могли точно вычислить арифметику c.
. После этого вам просто нужно построить соответствующий pmf для каждого ввода d ie. Входные данные просто [1, 1, 1, ... 1], если вы используете целые числа (в конечном итоге вам придется нормализовать) или [1 / n, 1 / n, 1 / n, ..., 1 / n] если рационально, где n = количество граней. Кроме того, вам нужно правильно обозначить индексы выходных данных - опять же, это немного сложно сделать правильно.
Свертка - это очень общий подход для суммирования переменных. Это может быть сделано еще более эффективным путем реализации свертки посредством быстрого преобразования Фурье, поскольку FFT (conv (A, B)) = FFT (A) FFT (B). Но на данный момент я не думаю, что вам нужно беспокоиться об этом.