Рандомайзер вариантов: случайный выбор из списка и выбор победителя


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

Инструмент для организации конкурсов и розыгрышей

Рандомайзер обеспечивает честный выбор победителей: результат выбирает криптографически стойкий генератор случайных чисел (Web Crypto API в вашем браузере). Подкрутить исход в свою пользу нельзя, но и доказать это посторонним обычный рандомайзер не может — расчёт идёт у вас на устройстве, а скриншот подделывается. Если результат нужно предъявить участникам конкурса, проводите розыгрыш с протоколом: список фиксируется до жеребьёвки, случайность даёт независимый маяк drand, и любой желающий пересчитает результат сам.

Выбор происходит мгновенно, без перезагрузки страницы. Режим «без повторов» даёт каждому варианту не больше одного места — как в настоящем розыгрыше. Кнопка «Удалить дубли» убирает повторяющиеся строки, чтобы у каждого участника были равные шансы, а режим «убирать победителей» позволяет разыгрывать призы по очереди: выпавший вариант исключается из списка. Каждый розыгрыш записывается в протокол, а ссылкой на результат можно поделиться с участниками.

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

  1. Вставьте список участников — по одному на строке (имена, ники, номера).
  2. Нажмите «Удалить дубли», если один участник мог попасть в список дважды.
  3. Укажите количество победителей — сервис покажет, какое место занял каждый.
  4. Нажмите «Выбрать» — победители определяются мгновенно и честно.
  5. Скопируйте результат или отправьте участникам ссылку на итог розыгрыша.

Выбор из двух вариантов

Не можете определиться? Рандомайзер помогает сделать выбор онлайн между двумя вариантами: «да или нет», «орёл или решка», пойти или остаться. Впишите оба варианта — или подставьте готовую пару одной кнопкой — и сервис случайно выберет один из двух. Так же легко выбрать из нескольких вариантов: трёх, пяти, десяти — просто добавьте строки.

Жеребьёвка, имена и не только

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

Как это устроено: почему выбор нельзя подстроить

Большинство рандомайзеров в интернете генерируют число через Math.random() — это быстрый, но не криптографический генератор (в браузерах на движке V8 внутри — xorshift128+). Он не предназначен для честных розыгрышей: спецификация JavaScript вообще не гарантирует непредсказуемость конкретной реализации. Для конкурса с реальными призами этого недостаточно.

Наш сервис использует crypto.getRandomValues() — Web Crypto API, криптостойкий генератор случайных чисел (CSPRNG), берущий энтропию из операционной системы. Тот же примитив браузер использует для ключей шифрования при TLS-соединении и в менеджерах паролей. На сервере (для клиентов без JavaScript) — аналог на PHP, random_int(), тоже криптостойкий, а не обычный rand().

Проблема modulo bias — и как мы её убираем

Наивный способ получить число от 0 до N обычно пишут как random() % N. Если 2³² не делится на N без остатка (а почти никогда не делится), часть значений выпадает на один «лишний» раз чаще остальных — результат перестаёт быть строго равновероятным. Чем меньше N относительно 2³², тем перекос незаметнее на глаз, но он есть всегда — а в честной жеребьёвке это недопустимо.

Мы используем rejection sampling: если сырое случайное число попадает в «неровный хвост» диапазона, оно отбрасывается и генерируется заново — так что каждый исход гарантированно равновероятен. Вот реальный код с этой страницы:

// равномерное целое [0, max) на crypto.getRandomValues, rejection sampling против bias
function cryptoInt(max) {
    var buf = new Uint32Array(1), limit = Math.floor(4294967296 / max) * max;
    do { crypto.getRandomValues(buf); } while (buf[0] >= limit);
    return buf[0] % max;
}

Перемешивание — алгоритм Фишера–Йейтса

Кнопка «Перемешать» и режим «без повторов» используют алгоритм Фишера–Йейтса (Fisher–Yates shuffle) — единственный широко признанный способ получить математически равномерную случайную перестановку списка. В отличие от популярного, но статистически смещённого приёма «отсортировать список по случайному числу», Фишер–Йейтс проходит список с конца и на каждом шаге меняет текущий элемент местами со случайным из ещё не обработанных — так что все перестановки списка равновероятны.

Частые вопросы

Это честный выбор? Можно ли подстроить результат?

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

Сколько вариантов можно добавить?

Практически без ограничений — списки в тысячи строк обрабатываются мгновенно, потому что выбор происходит прямо в вашем браузере.

Что делать с повторами в списке?

Нажмите «Удалить дубли» — останутся только уникальные строки, у всех равные шансы. Если оставить повторы, у варианта, который встречается чаще, шанс выше — иногда это нужно специально (например, дополнительные билеты за репост).

Сохраняется ли мой список?

Список и настройки автоматически сохраняются в вашем браузере (localStorage) и никуда не отправляются. Протокол розыгрышей тоже хранится только у вас.

Отзывы, вопросы и комментарии о сервисе случайного выбора из списка

4.0
1 отзыв(ов)

Войдите, чтобы оставить отзыв или комментарий

Число 13 всегда выпадает сначала, есть ли нюансы в алгоритме?
Илья
в прошлый раз рандомайзер выбрал один и тот же номер дважды хотя была настройка "без повторов" может я что-то упустил
Василий Фролов
при выборе между несколькими вариантами, как алгоритм обеспечивает равные шансы каждому? не заметил разницы между обычным и с протоколом
DustAndrey
Здравствуйте, Василий. Шансы равные. Число берётся не через Math.random, а через crypto.getRandomValues, и если оно попадает в «лишний хвост» диапазона — отбрасывается и генерится заново, поэтому перекоса от остатка деления нет. Режим «без повторов» перемешивает список Фишером-Йейтсом, там тоже все равноправны. Про протокол — случайность ровно та же, разница в другом. Обычный выбор считается у вас в браузере, и участникам его не докажешь, скриншот кто угодно нарисует. А в розыгрыше с протоколом список фиксируется заранее, случайность берётся у публичного маяка drand, и получается отдельная страница, где любой может пересчитать результат сам.