Насколько случайно нужно
Разным задачам нужны разные гарантии.
| Задача | Что требуется |
| --- | --- |
| Выбрать тестовый случай | что угодно, включая Math.random |
| Перемешать плейлист | равномерность без смещения |
| Розыгрыш призов | без смещения и с возможностью проверки |
| Секретный ключ | криптостойкость и никакого повторного использования |
Инструмент закрывает первые три пункта по части равномерности. Проверяемость он закрыть не может: страница, работающая только на вашем устройстве, ничего не способна доказать постороннему.
Смещение по модулю и почему его здесь нет
Очевидный способ отобразить случайное 32-битное число на 1–10 — это value % 10.
Он же и неверный: 2³² не делится на 10, поэтому первые шесть значений выпадают
чуть чаще. На десятке бросков этого никто не заметит, на миллионах — измеримо.
Повторный розыгрыш при попадании за пределы рабочего диапазона убирает перекос
полностью, ценой редкой лишней попытки.
Без повторов
Выборка без возвращения — это то, что нужно для определения победителей, распределения мест или отбора части тестовых строк. Диапазон должен быть не меньше количества: инструмент проверяет это и называет максимум, а не отдаёт молча меньше чисел, чем запрошено.
Ничего никуда не уходит
Розыгрыш идёт в браузере, числа не передаются и не логируются. После перезагрузки страницы предыдущий результат исчезает окончательно.
Вопросы
Годится ли это для розыгрыша призов?+
Используется `crypto.getRandomValues` — криптографический источник браузера, а не `Math.random`. Он действительно непредсказуем и не смещён. Чего он не даёт, так это *проверяемости*: сторонний наблюдатель не может убедиться, что розыгрыш прошёл так, как заявлено. Для публичного розыгрыша нужен способ, который зрители могут проверить, или сервис с публикуемым сидом.
Почему нельзя получить 100 уникальных чисел от 1 до 10?+
Потому что различных значений всего десять. Без повторов количество не может превысить размер диапазона, и инструмент говорит об этом прямо, а не молча возвращает десять.
Распределение действительно равномерное?+
Да. Наивные реализации берут случайное целое по модулю размера диапазона — и младшие значения выпадают чуть чаще, это классическое смещение по модулю. Здесь выходящие за пределы значения отбрасываются и берётся новое, поэтому шансы у всех равны.
Можно ли так генерировать пароли?+
Случайности хватает, но список чисел — плохой пароль. Возьмите отдельный генератор паролей: он работает с полным набором символов и правильно выбирает длину.