Back to blog
Механики

Честны ли броски костей в Mini Kraken? Заглядываем внутрь движка костей

Рано или поздно об этом спрашивают за любым столом: а не подкручена ли эта штука? Вот честный рассказ без жаргона о том, как Mini Kraken выбирает число — почему это честно, как это можно проверить самому и чего мы никог...

Честны ли броски костей в Mini Kraken? Заглядываем внутрь движка костей

Рано или поздно кто-нибудь за столом произносит это вслух: «Это никак не может быть случайностью. Эта штука меня ненавидит». Цифровая кость не может прогреметь по настоящему деревянному столу, поэтому, когда наваливается полоса неудач, естественно задуматься, не подкручивает ли приложение результат втихаря.

Справедливый вопрос. Он заслуживает прямого ответа, поэтому скажем сразу: кости Mini Kraken честны. У каждой грани равные шансы, ничего не подкручивается, и — что бывает редко — вы действительно можете проверить бросок сами. Эта статья простым языком объясняет, как именно это работает, чтобы в следующий раз, когда зайдёт такой разговор, вам было на что конкретно сослаться.

Что на самом деле значит «честно»

Прежде чем говорить о нашем движке, полезно определиться, что вообще такое честная кость.

Честный d20 означает одно: каждая из его двадцати граней равновероятна — чистый шанс один к двадцати в каждом броске. Не «примерно поровну». Не «поровну в среднем, с небольшой поправкой в пользу заведения». Ровно поровну. Честный d6 даёт каждой грани шанс один к шести; честный d100 — один к ста. Вот и всё определение.

Обратите внимание, чего честность не обещает. Она не обещает, что вы увидите все двадцать чисел, если бросите кость двадцать раз. Она не обещает, что полоса неудач вот-вот «выровняется». Она не обещает, что результат будет ощущаться равномерным. Честность — это всегда утверждение только о шансах в каждом отдельном броске, и вот здесь мы не идём на компромисс.

Движок под капотом

Mini Kraken не использует самодельных упрощений для броска костей. Каждый бросок — на сайте, в ваших листах персонажей, на виртуальном столе и через Discord-бота Fortuna — проходит через один и тот же общий движок костей, построенный на зрелой библиотеке костей с открытым исходным кодом, которая уже годами бросает кости для настольщиков.

Это важно по двум причинам. Во-первых, открытый исходный код означает, что математика — не чёрный ящик; это код, который любой может прочитать, протестировать и разобрать по косточкам. Во-вторых, это значит, что мы не изобретаем заново нечто тонкое и хрупкое. Случайность — из тех областей, где хитрые самоделки обычно вносят незаметное смещение, и проверенные временем библиотеки существуют как раз для того, чтобы никому не приходилось этого делать.

Самое важное — что делает движок, когда ему нужно число.

Как выбирается число — и почему в нём нет скрытого смещения

Вот та часть, о которой большинство людей никогда не слышит, и именно она — настоящее сердце вопроса «честно ли это?».

Наивный способ подделать бросок кости — взять случайное значение и подогнать его под нужный размер с помощью деления с остатком, программистский эквивалент «раздели и возьми остаток». Это быстро и почти честно. Но у этого есть известный изъян под названием смещение по модулю (modulo bias): поскольку исходный диапазон редко делится нацело на число граней кости, некоторые грани оказываются чуть-чуть вероятнее остальных. На одном d20 перекос крошечный, но он реален — и это именно тот невидимый палец на весах, из-за которого обвинения в «подкрутке» звучат так убедительно.

Наш движок отказывается от этого упрощения. Вместо того чтобы силой втискивать неудобное число, он использует приём, который часто называют методом выборки с отклонением (rejection sampling). Проще говоря: если сырое случайное значение попадает в тот крошечный остаточный кусочек, который исказил бы шансы, движок его отбрасывает и тихо тянет заново. Он оставляет только те значения, что ложатся идеально равномерно на грани кости. В результате получается распределение вообще без всякого смещения — каждая грань выпадает со своей точной, честной вероятностью. Вы никогда не замечаете эту редкую повторную выборку; она происходит за доли миллисекунды. Но именно благодаря ей d20 в Mini Kraken настолько равномерен, насколько это вообще позволяет математика.

Это технический стержень всего ответа. «Честно» — здесь не маркетинговое слово; это свойство того, как выбирается число.

3D-кости — это честный театр

Mini Kraken известен своими настоящими 3D-костями с физикой, которые кувыркаются по экрану и замирают, — и вот здесь у разумного человека могут закрасться подозрения. Если местоположение кости определяет физическая симуляция, разве нельзя настроить анимацию так, чтобы она выпадала на низкие числа?

Нет — и причина в порядке событий. Сначала движок выбирает число. И только потом анимации сообщают, на чём ей остановиться. Кувыркающаяся кость, за которой вы наблюдаете, — это добросовестное представление результата, который уже был честно определён мгновением раньше тем самым беспристрастным движком, описанным выше. Физика существует ради ощущений — того приятного стука и переката, которых лишён сухой текстовый результат, — а не ради определения исхода. Это зрелищность поверх честной математики, и она буквально не может подтолкнуть число, потому что число уже существует ещё до того, как кость приходит в движение.

Один движок повсюду — чтобы бросок значил одно и то же

Незаметный источник доверия — это единообразие. На некоторых платформах бросок в одном месте ведёт себя иначе, чем бросок в другом. В Mini Kraken d20 остаётся d20, где бы вы его ни бросили — коснувшись его в листе персонажа, кинув на виртуальный стол или напечатав в Discord-канале, где слушает Fortuna.

Это потому, что все эти поверхности обращаются к одному и тому же движку. Нет «доброго» генератора бросков для сайта и другого — для Discord. Бросок несёт совершенно одинаковый смысл по всей экосистеме, и это одновременно удобство и гарантия: не существует особого режима, где шансы тихонько меняются.

Бросок действительно можно проверить

Вот функция, которая превращает «поверьте нам» в «проверьте сами».

Движок поддерживает детерминированное воспроизведение. Проще говоря, бросок можно привязать к небольшому начальному значению, которое называют зерном (seed), и одно и то же зерно всегда воспроизводит совершенно ту же последовательность результатов. Скормите движку одно и то же зерно дважды — и каждый раз получите одинаковые кости. Это полная противоположность подкрученной системе: подкрученный генератор бросков вынужден скрывать, как он работает, а наш может выдать вам рецепт и доказать, что одни и те же входные данные всегда дают один и тот же, воспроизводимый результат. Случайность, которую можно воспроизвести, — это случайность, которую можно проверить.

Чего мы никогда не делаем

Честность — это в равной мере вопрос сдержанности, а не только техники. Поэтому скажем прямо: вот чего кости Mini Kraken не делают:

  • Никакой «кармы костей». Мы никогда не отслеживаем, что вам не везло, чтобы тайком подсунуть хороший бросок в качестве компенсации, — как и наоборот. Каждый бросок независим, ровно как у настоящих костей.
  • Никаких скрытых подтасовок. Нет невидимого «сглаживания», которое обрезает ваши крайности, чтобы результаты казались приятнее. Некоторые инструменты тихо так делают. Мы — нет; полоса есть полоса.
  • Никаких тайных модификаторов. Применяются только те бонусы, которые вы видите в броске, — модификаторы из вашего листа, преимущество и так далее. Ничего не прибавляется и не вычитается втёмную.
  • Никакого прицеливания. Движок не знает и знать не хочет, кто вы такой. Он не добрее к Мастеру и не жёстче к новичку. Он вообще понятия не имеет, что такое «игрок».

Костям всё равно. В этом безразличии и суть.

«Но мои броски всё равно странные»

Они и правда могут так ощущаться — и это ощущение реально, даже когда кости безупречны. Настоящая случайность неоднородна: она порождает полосы, скопления и жестокие совпадения по времени куда чаще, чем ожидает наша интуиция, а наша память цепляется за катастрофы, тихо отбрасывая заурядные средние броски, которые не стоят запоминания. Честный d20 совершенно точно иногда выдаст вам три единицы подряд; это не доказательство смещения, это доказательство того, что случайность делает свою работу.

Этот разрыв между «честно» и «ощущается честным» настолько велик, что заслуживает отдельной статьи — о психологии полос невезения читайте в материале Почему честные кости кажутся подкрученными. А если хотите унять внутреннего скептика опытным путём, честный тест — это объём: бросьте d20 несколько сотен раз и наблюдайте, как разброс выравнивается. Дюжина бросков всегда будет выглядеть неоднородно; тысяча скажет правду.

Бросайте с уверенностью

Итак, честен ли Mini Kraken? Да — по своему устройству, а не по обещанию. Каждая грань равновероятна, математика за каждым числом беспристрастна вплоть до десятых, 3D-анимация лишь разыгрывает результат, уже выбранный честно, один и тот же движок работает повсюду, а бросок можно воспроизвести и проверить, а не принимать на веру.

Кости вас не любят и не ненавидят. Они просто бросаются. И в Mini Kraken они бросаются честно — так что вы можете перестать гадать о механике и вернуться к истории, где и происходит всё самое интересное.