За каждым спином слота стоит короткий фрагмент кода, который выдаёт число, а число определяет, где остановится каждый барабан. В этой записи объясняется, как такой генератор работает в общем виде, на игрушечном примере, достаточно маленьком, чтобы посчитать его вручную. Генератор ниже придуман ради арифметики. В описании в Play для Brasslight Slots не сказано, как игра выбирает результаты, поэтому здесь ничего не описывается о коде этого приложения. Описывается стандартный метод.
Псевдослучайный, а не случайный
Компьютер выполняет инструкции, поэтому не может подбросить монету. Зато он может запустить псевдослучайный генератор чисел (PRNG): фиксированное правило, которое превращает одно число в следующее так, что поток выглядит беспорядочным для любой обычной проверки. Важны три части.
- Состояние. Скрытое число или числа, которые генератор переносит между выборками.
- Правило обновления. Фиксированный расчёт, который продвигает состояние вперёд и выдаёт результат.
- Начальное значение (seed). Стартовое состояние. Одно и то же начальное значение — один и тот же поток, каждый раз.
Начальное значение обычно берут из чего-то непредсказуемого, например из системных часов или пула энтропии операционной системы, чтобы каждая сессия начиналась с разного места. Дальше работает правило.
Генератор, который можно запустить на бумаге
Один из старейших вариантов — линейный конгруэнтный генератор: состояние умножается на константу, к нему прибавляется другая константа, и берётся остаток от деления на модуль. Наш использует модуль 16:
next = (5 × current + 3) mod 16
Начнём с начального значения 7. Тогда 5 × 7 + 3 = 38, и 38 mod 16 = 6. Далее 5 × 6 + 3 = 33, и 33 mod 16 = 1. Затем 5 × 1 + 3 = 8. Продолжая, получаем первые десять результатов: 6, 1, 8, 11, 10, 5, 12, 15, 14, 9. В этой игрушечной модели результат — это просто состояние.
Если запустить его на 16 шагов, каждое целое число от 0 до 15 появится ровно один раз: 6, 1, 8, 11, 10, 5, 12, 15, 14, 9, 0, 3, 2, 13, 4, 7. Семнадцатый результат снова равен 6, и вся последовательность повторяется. Длина этого цикла — это период, и здесь он равен 16.
Сопоставление числа с позицией барабана
Генератор выдаёт числа. Игре нужны позиции. Как описано в ленты барабанов и остановки, барабан — это список позиций, поэтому сопоставление — один шаг: берём число и используем его как позицию.
Допустим, у каждого барабана 16 позиций, пронумерованных от 0 до 15. Тогда результат 6 означает позицию 6, а результат 11 — позицию 11. Спин на пять барабанов берёт пять результатов подряд, по одному на барабан. Начиная с начального значения 7, первый спин использует 6, 1, 8, 11 и 10 для барабанов с 1 по 5, а второй спин берёт следующие пять: 5, 12, 15, 14 и 9.
Когда числа не делятся без остатка
Настоящие генераторы выдают гораздо большие диапазоны, часто 32 бита, что равно 232 = 4,294,967,296 возможных значений. Если у барабана 20 позиций, распространённый приём — взять остаток от деления на 20. Но 4,294,967,296 не делится на 20 без остатка: это 20 × 214,748,364 + 16. Поэтому 16 позиций получают по 214,748,365 сырых значений, а 4 позиции — по 214,748,364. Разница составляет одно значение примерно на 214 миллионов, слишком мало, чтобы иметь значение, хотя аккуратный код её убирает, отбрасывая остаточные значения и бросая заново.
Почему один спин не предсказывает следующий
Наш игрушечный генератор плохо моделирует независимость. Увидев один результат, вы с уверенностью знаете следующий: после 6 всегда идёт 1. Любой, кто знает правило и увидел одно число, может предсказать каждый спин. У него также всего 16 состояний, поэтому он может выдать только 16 разных спинов, по одному на каждое начальное состояние, тогда как независимые барабаны с 16 позициями допускали бы 165 = 1,048,576.
Серьёзные генераторы устраняют обе проблемы за счёт масштаба и конструкции. Mersenne Twister, широко применяемый генератор общего назначения, имеет период 219937 − 1, число с более чем 6,000 знаков, поэтому ни один игрок никогда не дойдёт до конца цикла. На практике результат одного спина не несёт пригодной информации о следующем. Это свойство описано в почему слот никогда не «должен» выплатить: у машины нет памяти о недавних результатах, на которые она реагировала бы, и нет графика, который она пытается нагнать.
Генератор — это детерминированное правило со скрытым состоянием. Его результат преобразуется в номер позиции, по одному на барабан, и для честности шансов важно, чтобы каждая позиция была равновероятной, а поток было трудно предсказать.
Как сопоставление влияет на шансы
Генератор ничего не знает о символах. Он выдаёт только номера позиций. Шанс символа определяется тем, сколько позиций его показывают, — это правило «количество на длину» из записи о ленте барабана. При 16 позициях и символе на двух из них барабан останавливается на нём с вероятностью 2 ÷ 16 = 12.5%.
Проверка, которую можно сделать самому
Возьмите любое начальное значение от 0 до 15 и прогоните игрушечное правило 16 шагов: каждое число от 0 до 15 должно появиться один раз. Запустите снова с тем же начальным значением, и вы получите тот же спин — именно в этом и состоит смысл начального значения.
Brasslight Slots: Casino Games — слот с кошачьей темой, 5 барабанов, 243 способа выиграть, бонус Yarn Pick, ежедневное колесо призов и режимы Turbo и Auto spin. Используются только виртуальные монеты, реальных денег в нём нет, а монеты и самоцветы не имеют денежной стоимости.