Что это за инструмент?
Рандомайзер списков переупорядочивает набор элементов в случайную последовательность или извлекает из него случайное подмножество. Сложность в том, чтобы сделать это без смещения: наивный подход, например сортировка массива со случайной функцией сравнения, даёт смещённое распределение, при котором некоторые порядки встречаются гораздо чаще других.
Этот инструмент использует алгоритм перемешивания Фишера–Йетса (Дурстенфельда) — стандартный метод получения доказуемо равномерной случайной перестановки: каждый возможный порядок вашего списка равновероятен.
Зачем его использовать?
- По-настоящему беспристрастное перемешивание — Фишер–Йетс, а не распространённый антипаттерн sort(() => Math.random() - 0.5), который искажает результаты.
- Режим выбора победителей: вытяните ровно N случайных элементов вместо перемешивания всего списка — идеально для розыгрышей и лотерей.
- Опциональное удаление дубликатов перед перемешиванием — для списков, где могли случайно оказаться повторы.
- Работает с любым текстом — именами, задачами, билетами, призами — по одному элементу на строку.
- Конфиденциально: перемешивание происходит полностью в вашем браузере, ничего не отправляется на сервер.
Как использовать
- Вставьте список в поле, по одному элементу на строку.
- При необходимости отметьте «удалить дубликаты перед перемешиванием», если список может содержать повторы.
- Для полной перестановки просто нажмите «Перемешать». Для выбора победителей отметьте опцию N элементов и укажите, сколько вытянуть.
- Скопируйте результат — нажимайте «Перемешать» снова в любой момент для нового случайного порядка или нового розыгрыша.
Пример
Ввод
Alice
Bob
Charlie
Diana
EthanРезультат
Случайно переупорядоченный список, например Charlie, Ethan, Alice, Diana, Bob — при каждом нажатии «Перемешать» результат другой.При режиме выбора победителей, установленном на 2, тот же ввод может дать только Ethan и Alice — это независимый случайный выбор 2 элементов, а не первые 2 из одного перемешанного порядка.
Почему наивное перемешивание даёт смещённые результаты
sort(() => Math.random() - 0.5) — распространённый приём, который выглядит правильным, но таковым не является: он полагается на то, что алгоритм сортировки вызывает функцию сравнения определённое число раз в определённом порядке, а реальные реализации сортировки этого не гарантируют. На практике это приводит к перемешиванию, в котором определённые порядки встречаются чаще других — достаточно незаметно при беглом взгляде, но статистически измеримо при большом числе запусков.
Фишер–Йетс полностью обходит эту проблему: вместо того чтобы просить алгоритм сортировки косвенно создать случайность, он напрямую меняет местами каждую позицию со случайной оставшейся позицией ровно один раз, что доказуемо равномерно независимо от реализации сортировки в используемом языке.
Часто задаваемые вопросы
Почему бы просто не использовать array.sort(() => Math.random() - 0.5)?
Эта строка — хорошо известный антипаттерн: sort() в JavaScript не гарантирует, что каждая пара элементов будет сравнена одинаковое число раз, поэтому итоговый порядок оказывается заметно смещён в пользу определённых перестановок — некоторые элементы с большей вероятностью, чем при настоящей случайности, оказываются ближе к началу или концу. Фишер–Йетс полностью избегает этой проблемы по своей конструкции, и именно этот алгоритм реально реализован в данном инструменте.
Действительно ли порядок перемешивания беспристрастен?
Да. Фишер–Йетс проходит список один раз, и на каждом шаге меняет местами текущий элемент с равномерно случайно выбранным элементом из ещё не перемешанной части. Математически доказано, что это даёт каждый возможный порядок с равной вероятностью при хорошем источнике случайности (Math.random() в JavaScript).
В чём разница между режимом перемешивания и режимом выбора победителей?
Режим перемешивания переупорядочивает все элементы вашего списка и показывает их все, только в новом порядке. Режим выбора победителей вытягивает только N случайных элементов и показывает только их — удобно, когда нужно выбрать фиксированное число победителей или образцов, не раскрывая весь переупорядоченный список.
Можно ли использовать это для настоящего розыгрыша призов?
Да, для неформальных розыгрышей и лотерей это отлично подходит, поскольку случайность действительно равномерна. Для юридически регулируемого розыгрыша с денежными призами проверьте местное законодательство — в некоторых юрисдикциях требуется определённый, поддающийся проверке процесс розыгрыша.
Изменяет ли удаление дубликатов мой исходный список?
Нет — удаление дубликатов влияет только на перемешанный результат, и только когда флажок включён. Ваш исходный список остаётся точно таким, каким вы его ввели, поэтому можно переключать опцию и перемешивать заново, не вводя всё заново.