Виртуальные кубики: честные броски, вероятности и d20
Как браузер бросает честный кубик, почему на 2d6 постоянно выпадает 7 и как выглядят числа за типичными бросками в D&D.
В каждой игровой компании была эта сцена: партия готова, персонажи созданы, а d20 исчез. Под диваном, у кота, неизвестно где. Бросок кубиков закрывает эту дыру: выбираете кость от d4 до d20, задаёте количество, жмёте «Бросить». Для игр по видеосвязи он тоже спасает — фраза «поверь, я выкинул 19» перестаёт быть смешной примерно к третьей сессии.
Как браузер бросает честный кубик
Очевидный способ запрограммировать d6 — взять Math.random() * 6. Большинство онлайн-бросалок так и делает, и для настолки на кухне этого достаточно. Но Math.random() — предсказуемый генератор, который никто не проектировал под гарантии честности.
Этот инструмент использует crypto.getRandomValues() — тот же источник случайности, из которого браузер собирает ключи шифрования. Остаётся одна тонкость: если взять случайное 32-битное число и посчитать остаток от деления на 6, некоторые грани будут выпадать чуть чаще других, потому что 4 294 967 296 на 6 нацело не делится. Это называется смещением по модулю. Лечится отбраковкой: верхний «хвост» диапазона просто выбрасывается, и число тянется заново. Смещение и так микроскопическое, но исправление стоит три строчки кода — жалко не исправить.
Почему на двух кубиках вечно выпадает 7
Один d6 — плоское распределение, каждая грань с шансом 1 к 6. Добавьте второй кубик, и распределение превратится в пирамиду. Семёрку можно собрать шестью способами (1+6, 2+5, 3+4 и их зеркала), а двойку — только одним. Поэтому 7 выпадает в 16,7% бросков 2d6, а «глаза змеи» — в 2,8%.
Отсюда драки за клетки 6 и 8 в «Колонизаторах». Отсюда же ощущение, что модификатор +5 к атаке даёт больше, чем кажется по цифре. Бросьте в инструменте пару сотен костей и посмотрите, как среднее сползает к 3,5 для d6 и к 10,5 для d20. Медленно сползает: первые полсотни бросков могут выглядеть дико несправедливыми.
Броски, которые реально делают за столом
Несколько чисел, полезных игроку в D&D:
- Чистая проверка d20 против СЛ 15 без модификатора проходит ровно в 30% случаев.
- Классический способ генерации характеристик — бросить 4d6 и отбросить худший кубик — даёт в среднем около 12,24, а не 10,5. Метод щедрый по задумке.
- Огненный шар на 8d6 в среднем наносит 28 урона, но разброс честный: от 8 до 48, и суммы меньше 20 будут попадаться чаще, чем хотелось бы.
Всё это можно проверить самому: поставьте количество 8, выберите d6 и бросайте, пока не поверите в среднее.
Серия повторов — не сломанный кубик
Три «двадцатки» подряд ощущаются как судьба. Да, конкретная последовательность — событие с шансом 1 к 8000. Но за четырёхчасовую сессию стол из пяти человек делает сотни бросков, и у редких событий полно попыток случиться. История в инструменте хранит каждый бросок с отдельными значениями — можно отмотать назад и убедиться, что кости просто вели себя как кости.
Единственное, чего серия не делает, — не влияет на следующий бросок. После трёх «двадцаток» шанс четвёртой всё те же 5%.
Нужен бросок прямо сейчас? Откройте Бросок кубиков, выберите кость — честную работу браузер возьмёт на себя.