fixmint
RU

Как честно выбрать победителя розыгрыша и показать ход выбора

Автор: · · обновлено 8 ноября 2026 г. · Чтение: 4 мин

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

Случайный выборЧестно выбрать победителяСделать бесплатно

Истинная и псевдослучайность

Источник истинной случайности получает непредсказуемость из физического процесса, например из электронного шума. Генератор псевдослучайных чисел — это формула. Он начинает с затравочного значения (seed), выполняет детерминированные шаги и выдаёт последовательность, которая выглядит случайной. Эта последовательность полностью определяется затравочным значением, поэтому тот, кто знает его и формулу, может предсказать каждое число.

Большинство программ использует псевдослучайные генераторы, и для перемешивания плейлиста или случайного уровня в игре этого достаточно. Но если в розыгрыше есть реальный приз, важно, сможет ли кто-то предсказать результат или повлиять на него. Быстрый, но предсказуемый генератор для этого не подходит.

Используйте криптографический генератор браузера

В JavaScript Math.random() — это быстрый псевдослучайный генератор. В его документации сказано, что он не подходит для криптографии, а розыгрыш призов — это выбор, где важна безопасность. Функция Web Crypto crypto.getRandomValues() заполняет массив значениями из криптографического источника случайности операционной системы. Её и нужно использовать. Случайный выбор применяет именно её для каждого выбора, в том числе для подбрасывания монетки и кубика. Выборщик, который не сообщает, что он использует, вызывает меньше доверия, поэтому прежде чем на него полагаться, уточните это.

Смещение по модулю на одном примере

Допустим, источник выдаёт случайный байт, то есть целое число от 0 до 255, а вам нужен один из трёх участников. Простой способ — взять остаток от деления на 3. Выглядит честно, но 256 не делится на тройки без остатка.

  • Значения 0, 3, 6 и так далее до 255 дают остаток 0. Таких значений 86.
  • Значений с остатком 1 — 85, и значений с остатком 2 тоже 85.

Поэтому участник 0 выпадает 86 раз из 256, то есть примерно в 33,6 % случаев, а участники 1 и 2 — по 85 раз, примерно в 33,2 %. Разница небольшая, но реальная, и она растёт, когда количество участников становится большим по сравнению с диапазоном источника.

Решение — отбраковка (rejection sampling). Берите значение, и если оно попадает в неравномерный остаток, бросайте его и берите новое. Для примера с байтом отбрасывайте 255 и принимайте только значения от 0 до 254, которые делятся на тройки без остатка. При 32-битном случайном числе такой остаток составляет примерно одно значение из 4,3 миллиарда, поэтому смещение для розыгрыша ничтожно. Аккуратный выборщик всё равно учитывает его, ведь та же ошибка становится заметнее по мере сужения диапазона.

Розыгрыш без повторов

Если победителей несколько, то выбор случайного индекса три раза может дважды дать одного и того же участника. Есть два корректных способа этого избежать:

  1. Убирайте каждого победителя из списка и выбирайте следующего из оставшихся.
  2. Один раз перемешайте весь список методом Фишера–Йетса, затем берите победителей с начала.

Метод Фишера–Йетса проходит список с конца, меняет каждую позицию местами со случайно выбранной позицией, стоящей на ней или раньше, и при честном выборе даёт каждый порядок с одинаковой вероятностью. Он короткий, хорошо изучен и легко объясняется участникам. Параметры «Удалять победителей из списка» и «Без повторов» в выборщике реализуют оба способа.

Сделайте розыгрыш проверяемым

Честный розыгрыш — тот, который может проверить любой. До розыгрыша:

  • Опубликуйте участников в виде нумерованного списка вместе с правилами, кто имеет право участвовать.
  • Опубликуйте отпечаток SHA-256 этого списка. Его можно получить любым инструментом для SHA-256, например генератором хэшей. Отпечаток полностью меняется, если изменится хотя бы одна запись, поэтому список нельзя незаметно отредактировать задним числом. Та же проверка подтверждает целостность загрузок; как проверить контрольную сумму SHA-256 файла описано по шагам.

Во время розыгрыша и после него:

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

Правила розыгрышей на разных платформах отличаются, а призовые игры могут подпадать под юридические требования, зависящие от места вашего проживания. Перед запуском проверьте правила площадки и местное законодательство. Это общие рекомендации, а не юридическая консультация. Когда будете готовы, выберите победителя с помощью случайного выбора.

Как сделать это в fixmint

  1. Выберите Имена, затем вставьте участников в поле Имена, по одному в строке.
  2. В поле Победители укажите количество призов. Отметьте Удалять победителей из списка, чтобы никто не выиграл дважды.
  3. Для розыгрыша по номерам выберите Число, задайте Наименьшее и Наибольшее, а затем отметьте Без повторов, если каждое число может выиграть только один раз.
  4. Нажмите Выбрать победителей, при этом запись экрана уже должна идти с самого начала.
  5. Опубликуйте пронумерованный список участников, отпечаток SHA-256, выигравшую запись и описание того, как использовался выборщик.

Краткие ответы

Подойдёт ли Math.random() для розыгрыша?

Для игр и перемешивания подойдёт, но для розыгрыша, который люди будут проверять, нет: его результат можно предсказать. Используйте криптографический источник.

Почему бы не взять случайное число и не найти остаток от деления на количество участников?

Если диапазон не делится на количество участников ровно, остатки распределяются неравномерно, и одни участники оказываются немного вероятнее других. Отбраковка устраняет это смещение.

Можно ли выбрать несколько победителей в одном розыгрыше?

Да. Удаляйте каждого победителя перед следующим выбором или перемешайте список один раз и возьмите верхние записи. В любом случае никто не выиграет дважды.

Переведено с помощью ИИ с Английский оригинал.

Комментарии

    Комментариев пока нет. Будьте первым.

    Ваша оценка (необязательно)

    Ваша почта никогда не показывается и не сохраняется.

    Обложка книги «The Paperoom Game Night Kit»The Paperoom Game Night Kit

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

    $7.00Купить на GumroadНа английском