ORLOV GAMES

Блог · Brasslight Slots ·

Как генератор случайных чисел определяет каждый спин

Компьютер не может бросать кости, поэтому он следует правилу, которое создаёт числа, ведущие себя как кубики. Начальное значение, состояние и отображение — три идеи, которые объясняют каждый спин.

За каждым спином слота стоит короткий фрагмент кода, который выдаёт число, а число определяет, где остановится каждый барабан. В этой записи объясняется, как такой генератор работает в общем виде, на игрушечном примере, достаточно маленьком, чтобы посчитать его вручную. Генератор ниже придуман ради арифметики. В описании в Play для Brasslight Slots не сказано, как игра выбирает результаты, поэтому здесь ничего не описывается о коде этого приложения. Описывается стандартный метод.

Псевдослучайный, а не случайный

Компьютер выполняет инструкции, поэтому не может подбросить монету. Зато он может запустить псевдослучайный генератор чисел (PRNG): фиксированное правило, которое превращает одно число в следующее так, что поток выглядит беспорядочным для любой обычной проверки. Важны три части.

  1. Состояние. Скрытое число или числа, которые генератор переносит между выборками.
  2. Правило обновления. Фиксированный расчёт, который продвигает состояние вперёд и выдаёт результат.
  3. Начальное значение (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.

Spin 1 reel 1 6 reel 2 1 reel 3 8 reel 4 11 reel 5 10 Spin 2 reel 1 5 reel 2 12 reel 3 15 reel 4 14 reel 5 9 Rule: next = (5 × current + 3) mod 16, seed 7. Each output is a stop number.
Первые десять результатов игрушечного генератора с начальным значением 7, по пять на спин как номера позиций на барабанах с 16 позициями. Спин 1 останавливается на позициях 6, 1, 8, 11, 10; спин 2 — на 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. Используются только виртуальные монеты, реальных денег в нём нет, а монеты и самоцветы не имеют денежной стоимости.

Доступно в Google Play