🪜 Игра с лестницей (Amidakuji)
Нажмите "Нарисовать лестницу", и инструмент нарисует одну вертикальную линию на игрока, а затем разбросает горизонтальные перекладины по фиксированным 12 рядам с использованием Math.random(). Поскольку каждая перекладина меняет местами только две соседние линии, и две перекладины на одной строке никогда не могут касаться друг друга, вся лестница математически гарантирует, что каждому игроку будет соответствовать ровно один результат — никто не получит двойной результат, независимо от того, где окажутся перекладины. Нажмите на имя после этого, и холст перерисует ту же лестницу, но с подсветкой маршрута этого игрока, чтобы вы могли наблюдать за процессом решения пошагово, а не просто получить ответ сразу.
Ladder Game генерирует случайную лестницу амидаку (ghost-leg) в вашем браузере, используя Math.random() JavaScript для размещения перекладин и API HTML Canvas для отрисовки и анимации пути каждого игрока до уникального результата.
Приватно по умолчанию. Этот инструмент работает полностью в вашем браузере — ничего из введённого не загружается и не сохраняется, и он работает офлайн.
Об инструменте
Утверждение о справедливости здесь не является маркетингом — оно напрямую следует из способа размещения перекладин. Каждый из 12 рядов строится, проходя по каждой паре соседних линий и проверяя Math.random() < 0.45 для перекладины, но код явно пропускает позицию, если слева уже есть перекладина ("!(i > 0 && row[i-1])"). Это единственное ограничение гарантирует, что ни один ряд не может содержать две перекрывающиеся перекладины, поэтому каждый ряд сам по себе представляет собой чистый набор неперекрывающихся перестановок — перестановку столбцов. Стекание двенадцати таких перестановок друг на друга — это просто последовательное составление двенадцати перестановок, а композиция перестановок всегда сама по себе является перестановкой. Поэтому два игрока, получившие один и тот же результат, здесь не просто маловероятны, это структурно невозможно, независимо от того, каковы результаты случайных бросков.
Это гарантия не охватывает, насколько *равномерно* результаты распределяются по всем возможным парам. Лестница всегда использует те же 12 рядов, независимо от количества игроков, которые вы вводите — источник этого фиксирован, а не масштабируется в зависимости от количества игроков. Для диапазона от 3 до 10 игроков, для которого этот инструмент предназначен, 12 рядов независимых бросков с вероятностью 45% дают достаточно пересечений, чтобы ощущение было как настоящего перемешивания. Однако, если вы увеличите количество имен до 30 или 50, 12 рядов просто недостаточно для достижения всех возможных пар с одинаковой вероятностью — люди, скорее всего, окажутся ближе к своему исходному столбцу, чем это было бы в случае с полностью равномерным перемешиванием. Если вам нужна справедливая случайная сортировка для большой группы, лучше использовать плоский случайный генератор, а не лестницу с ограничением в 12 рядов.
Также стоит прямо сказать, что Math.random() — это встроенный в браузер псевдослучайный генератор — он быстрый, достаточно хорош для решения, кто будет мыть посуду, и обычно участник не может повлиять на него извне страницы. Но он не криптографически безопасен: его внутреннее состояние, в принципе, может быть предсказано, если кто-то может наблюдать достаточно его вывода или знает алгоритм движка, поэтому реальные денежные розыгрыши, лицензированные лотереи и все, что имеет юридические последствия, используют crypto.getRandomValues() или аудированный, сертифицированный генератор случайных чисел. Этот инструмент не использует ни один из этих методов, и ему это не нужно для разделения обязанностей или выбора, кто купит кофе — просто не ставьте реальные призы на это.
С точки зрения взаимодействия: "Нарисовать лестницу" запускает весь процесс размещения перекладин с нуля, поэтому каждый клик представляет собой независимую выборку, которая не помнит предыдущую. "Показать все" пропускает постепенное раскрытие одного имени за раз и сразу печатает все пары игрок-результат на одной лестнице. В этой версии нет встроенной функции сохранения, экспорта или совместного использования — лестница существует только как пиксели на элементе canvas, и при перезагрузке страницы она стирается вместе с двумя текстовыми полями, которые сбрасываются обратно к образцовым именам и призам. Если вам нужен архив результата, единственный способ — использовать встроенный инструмент скриншота вашего браузера или устройства до того, как вы уйдете с этой страницы. Все остальное о данном инструменте соответствует рекламе: он работает полностью на стороне клиента, без сетевых запросов, после загрузки страницы, поэтому ничего, что вы вводите, никогда не загружается, и он продолжает работать без подключения к интернету.
Как пользоваться
- Введите имя каждого игрока в поле Игроки, по одному имени на строку — образцовые имена (Эми, Бен, Кара, Дэн) просто показывают формат и могут быть полностью заменены.
- Введите соответствующие результаты в поле Результаты, по одному на строку — инструмент откажет в рисовании и покажет ошибку, если списки не будут иметь одинаковое количество строк.
- Нажмите "Нарисовать лестницу", чтобы запустить новую серию вызовов Math.random() и отобразить новую группу перекладин на холсте — каждый клик представляет собой независимую выборку.
- Нажмите или щелкните по любому имени игрока, расположенному над лестницей, чтобы анимировать путь этого игрока в акцентном цвете сверху вниз и показать его соответствующий результат под ним.
- Нажмите "Показать все", если вы предпочитаете пропустить постепенное раскрытие и сразу увидеть все пары игрок-результат, напечатанные на одной лестнице.
Частые вопросы
- Использует ли лестница действительно случайный, непредсказуемый генератор чисел?
- Используется встроенный в браузер Math.random(), а не криптографически безопасный crypto.getRandomValues(). Это совершенно нормально для разделения обязанностей или определения, кто купит кофе, но внутреннее состояние Math.random() в принципе не защищено от предсказания, если кто-то может наблюдать достаточно предыдущего вывода. Не используйте этот инструмент — или любую лестницу, основанную на Math.random() — для проведения розыгрыша с реальными деньгами, призами с юридическим весом или в любой ситуации, где у участника есть стимул декодировать розыгрыш.
- Является ли сопоставление результатов действительно взаимно однозначным, или могут ли два игрока получить один и тот же приз?
- Взаимно однозначное сопоставление гарантируется по конструкции, а не по везению. Каждая перекладина соединяет только две соседние линии, а код явно отказывается размещать две перекрывающиеся перекладины в одной строке. Это делает каждый ряд лестницы своим маленьким, неперекрывающимся перемешиванием, а стекание двенадцати таких перемешиваний никогда не может направить две начальные линии в одну и ту же конечную линию — назначение является математической биекцией независимо от того, каковы результаты случайных бросков.
- Останется ли лестница справедливой, если я добавлю много игроков?
- Это честный предел: лестница всегда использует фиксированные 12 рядов, независимо от количества игроков. Для 3-10 игроков, для которых этот инструмент предназначен, этого достаточно для ощущения справедливого перемешивания. Однако, если вы введете 30 или 50 имен, 12 рядов не смогут создать достаточно пересечений, чтобы равномерно распределить результаты среди такого количества возможных пар — игроки, скорее всего, окажутся ближе к своему исходному положению, чем это было бы в случае с полностью равномерным перемешиванием. Для большой группы лучше подойдет плоский инструмент случайного назначения, чем лестница с ограничением в 12 рядов.
- Могу ли я сохранить или поделиться своей готовой лестницей?
- Не через сам инструмент — в этой версии нет встроенной функции сохранения, загрузки или совместного использования. Лестница существует только как пиксели, нарисованные на элементе canvas, пока страница открыта. Если вам нужен доказательство результата (классический "скриншот для разрешения спора"), используйте встроенный инструмент скриншота вашего браузера или устройства до того, как вы обновите страницу — перезагрузка сбрасывает холст и оба текстовых поля обратно к образцовым данным.
- Загружает ли этот инструмент что-либо, и работает ли он без интернета?
- Нет загрузки, и да, работает без интернета. Размещение перекладин, рисование на холсте и отслеживание пути выполняются внутри движка JavaScript вашего браузера без каких-либо сетевых запросов, поэтому инструмент продолжает работать после загрузки страницы даже без подключения к интернету, а имена и результаты, которые вы вводите, никогда не покидают ваше устройство.
- Загружает ли этот инструмент мои данные?
- Нет. Всё выполняется прямо в вашем браузере, поэтому ваши данные никогда не покидают устройство — после загрузки страницы он работает даже офлайн.