Подбрасывание монеты
crypto.getRandomValues · 50/50 · в браузере
crypto.getRandomValues — криптографически безопасным RNG браузера — до подбрасывания монеты, поэтому бросок чисто косметический, а результат доказуемо 50 / 50. Жмите кнопку, меняйте надписи или бросайте тысячу за раз пакетом.Почему результат справедливый
Результат монеты здесь — это бит, извлечённый из crypto.getRandomValues: страница читает свежее 32-битное беззнаковое целое и трактует его младший бит как «орёл» (0) или «решка» (1). В любом современном браузере это целое поступает из криптографического пула энтропии операционной системы — того же, что используется для генерации сессионных ключей TLS. Поскольку каждый бит независим и равномерно распределён, каждый бросок — настоящий 50 / 50 без памяти о предыдущих результатах.
Анимация косметическая
Решение орёл/решка принимается до начала вращения монеты — величина поворота и финальная ориентация выбираются так, чтобы монета приземлилась заданной стороной вверх. То есть анимация занятна, но не может повлиять на исход, и исход не может быть смещён никакими взаимодействиями с броском (никаких хитрых эксплоитов с нажатием кнопки).
Пакетный режим и закон больших чисел
Нажмите ×100 или ×1000, и весь пакет бросается за один раз. Страница анимирует одну представительную монету (показывая последний результат) и отрисовывает остальные мелкими фишками ниже. Сводная статистика (всего, % орлов, самая длинная серия) обновляется на протяжении всей сессии, поэтому вы можете видеть, как доля орлов сходится к 50% по мере роста N, и наблюдать редкие маловероятные серии — серии 10+ одной стороны бывают и не являются багом.
Настройка меток
Два текстовых поля управляют тем, что показано на сторонах орла и решки. Используйте их для двоичных решений, где «орёл/решка» не подходит как формулировка — Да / Нет, Остаться / Уйти, Бурито / Пицца. Длинные надписи автоматически уменьшаются, чтобы поместиться. Панель статистики переподписывается соответственно.
Конфиденциальность
Никакой бросок никогда не отправляется со страницы. История и статистика живут только в памяти этой вкладки и исчезают при её закрытии (здесь нет персистентности localStorage). Страница не делает сетевых запросов после первоначальной загрузки статических ресурсов, и нет аналитических скриптов.