Вариации на этот вопрос довольно типичные вопросы, но все мое гугл-фу оставило меня в тупике.Я хотел бы рассчитать шансы на бросок костей, но я хочу сделать это эффективно .Существует множество примеров того, как это сделать, но все алгоритмы, которые я нашел, слишком вычислительно дорогостоящи (экспоненциальное время), чтобы работать с большим количеством костей со многими сторонами.
Простая задача: Рассчитать шансы на бросок n на кубике с осью XY.
Простое решение: Создайте n-арное декартово произведение рулона, суммируйте каждое произведение, подсчитайте, сколько раз сумма является целью, сделайте небольшое деление и вуаля.
Пример простого решения в Go: https://play.golang.org/p/KNUS4YBQC0g
Простое решение отлично работает.Я расширил его, чтобы учесть случаи, такие как отбрасывание высших / низших n граней, и результаты применимы к выборочному тестированию.
Но рассмотрим {Count: 20,Sides: 20,DropHighest: 0,DropLowest:0, Target: 200}
.
Если я оценил это с предыдущимРешение, моя «таблица» будет иметь 104 нечетных ячейки септиллионов и будет довольно просто максимально загружать процессор.
Существует ли более эффективный способ вычисления вероятности для большого количества игральных костей со многими сторонами?Если да, то может ли он объяснить более сложный выбор условий «успеха», таких как сброс некоторых кубиков?
Я уверен, что это возможно благодаря существованию этого прекрасного веб-сайта: https://anydice.com/program/969
РЕДАКТИРОВАТЬ:
Решение, которое работало лучше всего для меня, был ответ Дэвида Эйзенстата, который я перенес: https://play.golang.org/p/cpD51opQf5h