Случайный выбор ученика и деление класса на команды: как сделать честно
Случайный выбор ученика честен, когда у каждого имени в списке одинаковый шанс: в классе из 25 человек — 1 из 25 при каждом выборе. Для этого нужен хороший генератор случайных чисел, например встроенный в браузер crypto.getRandomValues, а если каждый должен выйти ровно один раз, выбранное имя убирают из списка.

Выбрать ученика наугад кажется пустяком, но на уроке часто случаются две неприятности: одни и те же фамилии выпадают снова и снова, а команды получаются неравными. Разберём, что делает жеребьёвку честной, почему случайным числам компьютера можно доверять, чем выбор с возвращением отличается от выбора без возвращения и как раздать класс по командам. В конце — бесплатное колесо фортуны и генератор случайных чисел.
Главные идеи
- Жеребьёвка честная, если у всех одинаковые шансы: при 30 именах — 1 из 30 при каждом выборе.
- Браузерный crypto.getRandomValues — это псевдослучайный генератор с начальным значением достаточной энтропии, пригодный для криптографии; для урока этого более чем достаточно.
- Если имена возвращаются в список, повторы случаются удивительно часто: при 10 выборах из 30 имён хотя бы одно выпадет дважды с вероятностью около 82%.
- Чтобы вызвать каждого по разу, выбирайте без возвращения; чтобы собрать команды, перемешайте весь список и раздайте его по кругу — размеры команд будут отличаться не больше чем на одного человека.
Когда случайный выбор ученика можно назвать честным?
Когда у каждого имени при каждом выборе один и тот же шанс. Если в списке 25 человек, у любого из них 1 шанс из 25 — неважно, кого вызвали в прошлый раз. Честность — свойство способа, а не отдельного результата: честная жеребьёвка может выбрать одного и того же ученика два раза подряд, как честная монета может дважды упасть орлом.
Бумажные способы тоже бывают честными. Одинаковые бумажки с именами, сложенные одинаково и хорошо перемешанные в шапке, дают всем равные шансы; бумажки разного размера или учитель, который их видит, — уже нет. Слабое место обычно в перемешивании, а жеребьёвка, которой кто-то мог бы управлять, не покажется классу честной, даже если она такой была.
Компьютер выбирает из списка так: нумерует имена от 1 до n, берёт случайное целое число в этом диапазоне и смотрит, чьё имя под ним. Тонкость в одной детали. Исходные случайные числа лежат в фиксированном диапазоне, и если подогнать их к 1…25 простым остатком от деления, маленькие результаты будут выпадать чуть чаще: этот диапазон редко делится на 25 ровных частей. Аккуратный генератор отбрасывает неровный остаток и тянет число заново — это называется выборкой с отклонением.
Насколько случайны случайные числа компьютера?
В строгом смысле — нет, но для любого урока они достаточно непредсказуемы. Ради скорости браузер не обращается к по-настоящему случайному источнику за каждым числом: crypto.getRandomValues использует псевдослучайный генератор, которому задают начальное значение с достаточной энтропией, а сам алгоритм должен быть пригоден для криптографии. Начальное значение берётся, например, из генератора случайных чисел операционной системы.
Псевдослучайный генератор — это формула, которая превращает начальное значение, так называемое зерно, в длинную последовательность чисел, ведущую себя как случай. В JavaScript есть и более простой Math.random; справочник MDN называет его некриптографическим источником — он не обещает, что результат нельзя предсказать. Для жеребьёвки, которой должны доверять, например кто первым выступает или кто получает приз, лучше криптографический генератор.
Как выбирать учеников без повторов?
Выбирайте без возвращения: вышедшее имя покидает список, пока не ответят все. В статистике так получается простая случайная выборка, где у любой группы одного размера одинаковые шансы попасть в неё, и выбор без возвращения — обычный способ её получить.
С возвращением повторы приходят быстро. При 10 выборах из 30 имён вероятность, что хотя бы одно выпадет дважды, — около 82%, а после 30 выборов у каждого ученика остаётся примерно 36% шансов так ни разу и не выйти к доске. Без возвращения 30 выборов вызывают всех 30 человек ровно по одному разу.
Порядок на целый круг можно задать сразу, перемешав список. Стандартный способ — тасование Фишера — Йетса: Рональд Фишер и Фрэнк Йейтс описали его в 1938 году, а Ричард Дурстенфельд в 1964-м приспособил для компьютера. Алгоритм идёт по списку с конца и меняет каждое имя местами со случайно выбранным именем на той же или более ранней позиции; при несмещённом источнике случайности любой порядок одинаково вероятен.
Как разделить класс на команды случайным образом?
Перемешайте весь список и раздайте имена по одному, как карты: в первую команду, во вторую и так далее, потом снова в первую. Так размеры остаются равными. 30 учеников на 4 команды дают составы из 8, 8, 7 и 7 человек; 27 учеников по 4 в команде дают 7 команд — шесть по четыре и одну из трёх.
Чтобы вызывать учеников по одному, откройте бесплатное колесо фортуны VITON13 SCHOOL. Впишите или вставьте до 100 имён, по одному в строке, и крутите кликом, кнопкой «Крутить», пробелом или Enter: победитель определяется через crypto.getRandomValues ещё до начала вращения. Включите «Убирать выпавшего» — каждое имя уйдёт с колеса после своей очереди, а кнопка «Вернуть» возвращает всех. «Полный экран» увеличивает колесо для проектора, «Поделиться» копирует ссылку со списком, а повтор строки даёт варианту второй сектор и больший шанс.
Чтобы выбрать сразу несколько человек или собрать команды, откройте генератор случайных чисел. В режиме «Список» вставьте имена и укажите, сколько выбрать, — повторов не будет. В режиме «Команды» поделите список на заданное число команд или на команды заданного размера: список перемешивается и раздаётся по кругу, так что составы различаются не больше чем на одного. Последние 20 результатов хранятся только в вашем браузере, на сервер ничего не отправляется.
Простыми словами
Честная жеребьёвка похожа на хорошо перетасованную колоду: ни одна карта не знает, где окажется. Выбор без возвращения — это раздать колоду до конца и только потом тасовать снова, чтобы каждый получил ровно одну очередь.
Попробуйте сами
Вставьте список класса в колесо фортуны, включите «Убирать выпавшего» и крутите, пока не останется одно имя.
Ожидаемый результат
Каждое вращение крупно показывает одно имя, и оно уходит с колеса при следующем запуске. Когда остаётся одно имя, этот ученик идёт последним, а кнопка «Вернуть» начинает новый круг.
Проверьте себя: Класс из 24 человек делят на 5 команд, раздавая перемешанный список по кругу. Какого размера получатся команды?
Четыре команды по 5 человек и одна из 4. После первых 20 имён в каждой команде по 4 человека, оставшиеся 4 имени уходят в первые четыре команды: 5 + 5 + 5 + 5 + 4 = 24.
Вопросы и ответы
Может ли случайный выбор дать одно и то же имя два раза подряд?
Да, если имена возвращаются в список. Каждый выбор независим, поэтому при 25 именах шанс, что одно и то же выпадет дважды подряд, — 1 из 25. Чтобы этого не было, убирайте выпавших.
Колесо фортуны честнее, чем бумажки в шапке?
Оба способа честные, если всё сделано аккуратно. Шапка зависит от одинаковых бумажек и хорошего перемешивания, а наше колесо определяет победителя криптографическим генератором браузера ещё до вращения, так что анимация на результат не влияет.
Когда в следующий раз понадобится доброволец или команды, вставьте список класса в бесплатное колесо фортуны или генератор VITON13 SCHOOL, выбирайте без возвращения и дайте классу увидеть жеребьёвку своими глазами.
Источники и дальнейшее чтение
- Fisher–Yates shuffle — Wikipedia ↗Источники проверены:
- MDN Web Docs: Crypto.getRandomValues() ↗Источники проверены:
- Simple random sample — Wikipedia ↗Источники проверены: