Генератор случайных команд
Введите список имён, и генератор случайных команд мгновенно разделит его на равные команды: выберите количество команд или человек в команде, выровняйте суммарный навык и скопируйте результат одним щелчком.
Разделение списка имён на случайные команды
Формула генератора команд
Где:
- \(n\) — количество человек в списке
- \(T\) — количество команд
- \(s_i\) — размер команды \(i\) (размеры отличаются не более чем на 1 человека)
- \(P\) — желаемое число человек в команде, если деление идёт по размеру команды
- \(S_{\max}\), \(S_{\min}\) — наибольшая и наименьшая суммы навыков; \(\Delta\) — выводимый разброс навыков
Первая формула гарантирует максимально ровные размеры команд: каждая получает \(\text{осн}\) участников, а первые \(\text{доп}\) команд — ещё по одному сверх того. Разброс навыков \(\Delta\) показывает, насколько далеко друг от друга сильнейшая и слабейшая команды; при включённой балансировке генератор стремится свести \(\Delta\) к нулю.
Генератор команд — пример расчёта
Пример: шесть человек с рейтингами навыка — Алиса 9, Боб 7, Кэрол 8, Дэн 5, Ева 6, Фрэнк 4 — делятся на 3 команды с названиями «Акулы», «Волки», «Орлы», при включённой опции «Уравнять по навыку» (значения калькулятора по умолчанию).
\[ n = 6, \quad T = 3 \quad \Rightarrow \quad \text{осн} = \left\lfloor \tfrac{6}{3} \right\rfloor = 2, \quad \text{доп} = 0 \Rightarrow s_i = 2 \]
\[ \text{сумма навыков} = 9 + 7 + 8 + 5 + 6 + 4 = 39, \quad \text{справедливая доля} = \tfrac{39}{3} = 13 \]
После сортировки по убыванию навыка и раздачи каждого следующего человека в команду с наименьшей текущей суммой пары получаются такими: \(9+4\), \(8+5\) и \(7+6\):
\[ 9 + 4 = 13, \quad 8 + 5 = 13, \quad 7 + 6 = 13 \quad \Rightarrow \quad \Delta = 13 - 13 = 0 \]
Результат: «Акулы» — Алиса (9), Фрэнк (4); «Волки» — Кэрол (8), Дэн (5); «Орлы» — Боб (7), Ева (6). В каждой команде по 2 человека и суммарный навык ровно 13, то есть разброс равен 0 — идеально сбалансированная жеребьёвка.
Как пользоваться калькулятором
- Введите имена в поле Имена — по одному в строке. Чтобы использовать балансировку по навыку, добавьте после имени число через запятую или точку с запятой, например
Алиса, 9(для дробных значений используется точка, напримерАлиса, 8.5). Пустые строки игнорируются. - Выберите способ деления в поле Разделить по: «Количество команд» или «Человек в команде». Ниже появится соответствующее поле («Количество команд» или «Человек в команде»).
- При желании укажите «Названия команд (необязательно)» через запятую, например
Акулы, Волки, Орлы. Команда без названия получит имя «Команда 1», «Команда 2» и так далее. - Если у имён есть числа навыков, оставьте включённой опцию «Уравнять по навыку», чтобы суммарный навык команд был примерно одинаковым; снимите флажок для чисто случайной жеребьёвки.
- Готовые команды появятся в блоке «Ваши команды» — вместе с количеством команд, числом человек в каждой и разбросом навыков. Нажмите «Перемешать снова» для новой жеребьёвки или «Копировать как текст», чтобы отправить весь список в буфер обмена.
Что такое генератор случайных команд?
Генератор случайных команд принимает список имён и делит его на команды без какого-либо перекоса — по сути, это то же самое, что тянуть бумажки с именами из шляпы, только быстрее и честнее. Он удобен, когда нужно поделить класс на проектные группы, собрать составы для дворового матча, рассадить участников по столам на мастер-классе или составить случайные пары для турнира или «Тайного Санты».
Честность здесь означает две вещи. Во-первых, никому и ничему не отдаётся предпочтение: список перемешивается алгоритмом Фишера — Йетса на криптографически стойких случайных числах (crypto.getRandomValues), поэтому каждое возможное деление на команды равновероятно. Во-вторых, команды равны по размеру: размеры никогда не отличаются больше чем на одного человека, так что никто не останется в одиночной команде, пока остальные играют в полном составе.
Необязательная балансировка по навыку добавляет третий уровень честности. Каждому человеку можно присвоить число — рейтинг, гандикап, результат прошлой недели, разряд по настольному теннису, — и генератор распределит людей так, чтобы суммарные показатели команд вышли максимально близкими. Люди сортируются от самого сильного к самому слабому, и каждый попадает в подходящую команду с наименьшей текущей суммой. Значение «Разброс навыков» в результатах (разница между сильнейшей и слабейшей командой) показывает, насколько это удалось: 0 означает идеально равные суммы, а небольшие значения — что борьба обещает быть равной.
Обратите внимание: при включённой балансировке жеребьёвка лишь частично случайна: размеры и ровность команд гарантируются, суммы сбалансированы, но полностью непредсказуемое деление уже не является целью. Если нужна совершенно непредвиденная жеребьёвка — как в колесе фортуны или при подбрасывании монетки — снимите флажок балансировки или воспользуйтесь нашим генератором игральных кубиков для быстрых случайных решений.
Ограничения и практические советы
- Список принимает от 2 до 200 имён, до 120 символов в строке. Числа навыков должны быть в диапазоне от 0 до 1000 и могут быть десятичными с точкой.
- Имена без числа навыка при подсчёте сумм считаются нулём. Если вы смешиваете имена с навыками и просто имена, разброс всё равно останется заметным — для лучшего результата присвойте число каждому участнику.
- Балансировка по навыку — быстрый «жадный» метод, а не полный перебор. Для обычных списков он находит сбалансированное деление, но при особо хитрых комбинациях чисел может существовать математически идеальный вариант, который калькулятор упустит совсем чуть-чуть.
- Если делить по «человеку в команде» и список не делится нацело, последняя команда просто получает оставшихся людей — об этом прямо говорится в примечании к результату.
- Команды сохраняют состав, пока ничего не меняется: правка имени, смена параметров деления или нажатие «Перемешать снова» запускают новую жеребьёвку. Поэтому результат можно скопировать или сделать снимок экрана, не боясь, что он изменится под руками.
- Поскольку перемешивание выполняется криптографическим источником случайности браузера, жеребьёвки невоспроизводимы, а список имён нигде не сохраняется — всё происходит локально в вашем браузере.
- Когда нужен один победитель, а не команды — выбрать одно имя из шляпы, определить, кто ходит первым, — лучше подойдёт монетка или инструмент случайного выбора.
Часто задаваемые вопросы
Как разделить список на команды случайно, без специальных инструментов?
Напишите каждое имя на бумажке, положите бумажки в шляпу и вытягивайте по одной: первая бумажка образует команду 1, следующая — команду 2 и так далее, по кругу, и снова к команде 1. Такое деление «по кругу» уравнивает размеры команд с точностью до одного человека. Записывайте порядок жеребьёвки, чтобы никто не заподозрил вас в предвзятости, или попросите нейтрального человека тянуть бумажки.
Перемешивание действительно случайное и честное?
Да. Генератор использует тасование Фишера — Йетса на криптографическом источнике случайности браузера (crypto.getRandomValues) — того же качества, что применяется в задачах безопасности. Любое возможное деление на команды равновероятно, ни одно имя, позиция или команда не получает преимущества. Учтите: при включённой балансировке по навыку жеребьёвка намеренно лишь частично случайна, потому что цель смещается от непредсказуемости к равной силе команд.
Каким должен быть хороший разброс навыков?
Разброс навыков — это разница между суммами сильнейшей и слабейшей команд. 0 — идеал, суммы совпадают, а вот «достаточно малый» разброс зависит от ваших рейтингов: при навыках около 5–10 разброс 1–2 обычно не мешает равной борьбе, а при рейтингах около 100 такой разброс вообще незаметен. Если разброс кажется большим, добавьте числа навыков тем, у кого их нет: пропущенные числа считаются нулём.
Что будет, если список не делится нацело?
Ничего не сломается — оставшихся людей распределяют в первую очередь. При делении на фиксированное количество команд размеры никогда не отличаются больше чем на одного, поэтому 10 человек на 3 команды дадут размеры 4, 3, 3. При делении по числу человек в команде последняя команда получает остаток: 10 человек при 3 в команде — это 4 команды, последняя всего с 1 человеком, и в примечании к результату это прямо указано. Если не хочется получать крошечную команду-остаток, делите по количеству команд.
Можно ли использовать это для «Тайного Санты» или выбора, кто ходит первым?
Для обмена подарками инструмент работает хорошо, если задать по 2 человека в команде — каждая пара имён покажет, кто кому дарит. Правда, помните: в каждой паре участники «дарят друг другу», что скрывает меньше деталей, чем полное построение цепочки. А вот для выбора единственного победителя, докладчика или того, кто ходит первым, деление на команды не подходит — быстрее и по делу будет генератор случайного имени или монетка.
Почему при балансировке по навыку всё время выпадают одни и те же или очень похожие команды?
Так и задумано. При включённой балансировке люди сортируются по навыку, и каждый присоединяется к команде с наименьшей текущей суммой, поэтому структура деления во многом задаётся самими числами — меняться может лишь порядок среди равных навыков и очерёдность распределения по командам. Если хотите, чтобы каждая жеребьёвка была совсем другой, снимите флажок «Уравнять по навыку» для чисто случайного деления.
Можно ли разбить нечётное число человек на команды по 2, например пары для турнира?
Да, но заложитесь на остаток. 9 человек при 2 в команде — это 4 команды плюс последняя команда из 1 человека, потому что остаток достаётся ей. Если одинокая «команда одного» для вашего мероприятия бесполезна, либо уберите одно имя (классический «бай» в турнирной сетке), либо добавьте опоздавшего, чтобы выровнять число участников, либо снизьте планку и делите по количеству команд, чтобы размеры вышли максимально ровными (например, 9 человек — 3 команды по 3).