Как работает генератор случайных чисел и когда он нужен
Что делает генератор честным, почему криптослучайность лучше Math.random() и где это пригодится — от розыгрышей до выборок.
Однажды я видел, как команда выбирала победителя розыгрыша: прокручивали таблицу и останавливались, «когда почувствуется». Тем, кто не выиграл, ничего такого не почувствовалось. Загадать число в голове — это вообще не случайность: мы тянемся к семёрке, избегаем краёв и повторяем любимые числа, сами того не замечая. У компьютера таких привычек нет — ради этого его и берут.
Генератор случайных чисел выбирает числа между любыми двумя значениями прямо в браузере, без регистрации и без отправки чего-либо на сервер.
Что здесь значит «случайно»
Случайность бывает двух видов, и они не равноценны.
Привычный вариант — Math.random(). Он быстрый и годится, чтобы перемешать вопросы в викторине или добавить дрожание анимации, но это псевдослучайность: формула выдаёт поток, который выглядит случайным, хотя полностью задан скрытым начальным числом. Узнав это число, можно предсказать всё, что будет дальше.
Здесь работает другой источник — Web Crypto API (crypto.getRandomValues). Браузер берёт энтропию из аппаратного шума, который собирает операционная система, поэтому результат нельзя воспроизвести по начальному значению. Тот же источник используют менеджеры паролей. Для розыгрыша это разница между «вроде нормально» и «можно объяснить, если кто-то спросит».
С повторами или без
Единственная настройка, на которой спотыкаются, — переключатель «Без повторов». Объясню по-простому:
- Оставьте его выключенным — числа могут повторяться, как при многократном броске кубика. Бросьте пять раз и можете получить две четвёрки.
- Включите — каждое число будет разным, как если вытаскивать билетики из чаши и не возвращать обратно.
Выбирайте «без повторов» для победителей, лотереи и распределения людей по местам. «С повторами» — для кубиков, симуляций и всего, что моделирует независимые события.
Одно правило тут жёсткое: нельзя вытащить больше уникальных чисел, чем есть в диапазоне. Попросите 10 разных чисел от 1 до 5 — генератор так и скажет, а не зациклится: значений всего пять.
Где это реально применяют
- Розыгрыши и конкурсы — пронумеруйте участников от 1 до N, выберите победителей без повторов, сделайте скриншот.
- Опрос в классе — пронумеруйте список и пусть генератор решает, кто отвечает, чтобы тянули руку не одни и те же трое.
- Выборки — проверяете 40 счетов из 2000? Сгенерируйте 40 уникальных номеров строк и возьмите их.
- Игры — кубики, позиции карт, ходы на доске, когда физического набора под рукой нет.
- Тестовые данные — быстрые числовые ID или значения, когда на скорую руку собираете прототип.
Пара слов о честности
Случайно и честно — не одно и то же. Математически равномерный генератор всё равно покажется нечестным, если никто не может проверить. Поэтому, когда ставки важны, делайте розыгрыш на виду: покажите экран, заранее договоритесь о диапазоне и количестве, а потом сгенерируйте один раз. Честность — в процедуре, а не в алгоритме, хотя и алгоритм здесь не халтурит.
Задайте диапазон, укажите, сколько чисел нужно, и пусть Генератор случайных чисел выберет за вас — честно и без таблиц-цирка.