Генератор случайных чисел
Результат
Выпавшие числа
- Возможные значения
- 100
- Вероятность хотя бы одного повтора
- 9,65 %
Этот генератор случайных чисел превращает начальную точку в список целых чисел. Вы задаёте диапазон, сколько чисел нужно и случайное зерно, с которого начинается последовательность, и панель возвращает ровно столько значений — все они целые числа, и оба конца диапазона включены. При одном и том же зерне список выходит один и тот же, и именно это делает его списком, который можно передать другому и получить обратно тем же. Отключите повторы — и результат станет выборкой, а не последовательностью, так что ни одно значение не сможет выпасть дважды; оставьте их включёнными — и числа будут независимыми вытягиваниями, а это честная модель для кубика, лотерейного барабана или перемешанного плейлиста, где повторы возможны. Панель также сообщает, сколько различных значений вмещает диапазон и насколько вероятен повтор.
Формула
next = (state + 0x6D2B79F5), перемешанное умножением со сдвигом → value = minimum + ⌊next × (maximum − minimum + 1)⌋
- seed
- Начальное состояние генератора, любое целое от 0 до 4 294 967 295. Само по себе оно не источник случайности — это точка, с которой начинается последовательность, и именно поэтому одно и то же зерно всегда даёт один и тот же список
- state
- Текущее состояние, обновляемое по разу на число. Обновление смешивает состояние с фиксированной константой и несколькими шагами умножения со сдвигом; именно смешивание и делает соседние значения непохожими, и именно этот шаг сломался бы первым, если бы его упростили
- minimum, maximum
- Концы диапазона, оба включаются. Ширина диапазона — то, на что умножается доля, поэтому у каждого целого числа диапазона одинаковый шанс
- ⌊ ⌋
- Округление вниз. Генератор выдаёт долю в промежутке [0, 1), а округление вниз превращает её в одно из целых чисел диапазона
- count
- Сколько чисел выдать, до 200. С выключенными повторами оно не может превысить ширину диапазона, потому что выборка не бывает длиннее пула, из которого берётся
Берите его, когда нужен именно список, а не одно число: выборка, которую надо проверить вручную, набор тестовых случаев, обязанный совпадать при каждом запуске, розыгрыш, который хочется прогнать заново на глазах у аудитории, или данные-заглушки. Возможность зафиксировать зерно и есть причина предпочесть это любой случайной функции, которая идёт в комплекте с языком: зерно превращает одноразовый результат в то, чем можно поделиться, что можно перепроверить и о чём можно спорить. Обращайтесь к нему с выключенными повторами, когда один и тот же элемент не должен появиться дважды, — такова форма лотерейного розыгрыша, случайной выборки из списка и перемешанного порядка. И две вещи, для которых он не годится: он не источник непредсказуемых чисел, поэтому всё, что обязано быть неотгадываемым, здесь не место; и он не замена статистической случайной выборке из реальной совокупности, потому что о совокупности он не знает ничего, а знает только о диапазоне.
Разобранные примеры
Пять чисел от 1 до 100 и те же пять снова
- Диапазон от 1 до 100 вмещает 100 различных значений, поэтому каждое вытягивание — одно из 100
- Зерно 1 фиксирует начальное состояние; каждое из пяти чисел обновляет его по разу
- Округление каждой доли вниз в промежуток от 1 до 100 даёт 63, 1, 53, 99 и 97 в этом порядке
Эти пять чисел — не совпадение и не сохранённая наперёд таблица: это то, что даёт зерно 1, и повторный ввод 1 в поле зерна воспроизводит их в точности. Заметьте, что 9,65 % — утверждение о диапазоне и количестве, а не об этой конкретной раздаче: при пяти вытягиваниях из ста значений шанс, что два из них совпадут, чуть меньше одного из десяти, независимо от того, совпала ли хоть одна пара в этом списке. Смена зерна на 7 даёт совершенно другой список, не трогая этот процент, и это самый чистый способ увидеть, какая часть панели случайна, а какая — арифметика.
Шесть чисел от 1 до 49 с запретом повторов
- Пул — 49 значений, и шесть вытягиваются без возвращения
- Каждое новое число перевытягивается, пока не окажется тем, которого пул ещё не отдал, и поэтому значение не может появиться дважды
- Если читать список в порядке появления, получается 23, 16, 33, 31, 8 и 11
Выключение повторов не меняет 27,26 %, и в этом и смысл показывать это число рядом с примером: это шанс, что шесть вытягиваний из 49 столкнулись бы, если бы повторы были разрешены, и он одинаков независимо от того, запретили вы их или нет. Именно поэтому выборка без повторов дорого обходится при больших количествах: при 49 значениях и 6 вытягиваниях больше четверти неограниченных раздач повторили бы что-нибудь, а к 23 вытягиваниям из 365 эта величина превышает половину. Числа остаются в порядке вытягивания, а не сортируются, — чтобы одно и то же зерно и одни и те же настройки всегда воспроизводили один и тот же список.
Диапазон, в котором всего одно значение
- Диапазон вмещает ровно одно значение, поэтому каждое вытягивание даёт именно его
- Шанс повтора — это шанс, что четыре вытягивания столкнутся, а при пуле в одно значение они обязаны столкнуться
- Результат — 7, 7, 7 и 7
Это та граница, на которой генератор случайных чисел перестаёт быть случайным и становится константой, и её стоит держать в голове, потому что это единственный случай, когда вывод полностью предсказуем до нажатия. Она же отмечает границу режима без повторов: при том же диапазоне просьба о двух числах без повторов — невыполнимое требование, а не короткий список, и страница говорит об этом, вместо того чтобы молча вернуть одно число.
Ограничения
Эти числа не годятся ни для чего, что обязано быть неотгадываемым. Генератор — это небольшая, быстрая, начатая зерном арифметическая последовательность, из тех, что встроены в обычное программное обеспечение: зная зерно, любой воспроизведёт весь список, а по нескольким его значениям восстановит и остальные. Это исключает его из паролей, ключей, токенов, одноразовых кодов, лотерей с деньгами и всего прочего, где участник не должен уметь предсказать или восстановить раздачу. Для них единственно верный ответ — криптографический источник случайности. Шанс повтора тоже не является утверждением о списке, на который вы смотрите: это вероятность того, что раздача такого размера из такого пула содержит хотя бы одно совпадение, посчитанная так, как если бы вытягивания были независимыми и равномерными, и она показывается независимо от того, были повторы разрешены или нет. Практический смысл у неё тот, что чаще всего и застаёт врасплох: для столкновения достаточно примерно квадратного корня из размера пула, поэтому 23 вытягивания из 365 уже превышают равные шансы. И количество ограничено 200 за запуск, а без повторов оно вовсе невозможно, как только превысит пул.
Частые вопросы
- Этими числами можно пользоваться в лотерее, пароле или токене безопасности?
- Нет. Этот генератор — небольшая начатая зерном арифметическая последовательность, из тех, что использует обычное программное обеспечение, а не криптографическая: по зерну воспроизводится весь список, а по нескольким его значениям восстанавливаются остальные. Всё, где участник не должен уметь предсказать или восстановить результат, — лотереи с деньгами, пароли, ключи, токены, одноразовые коды — требует вместо этого криптографического источника случайности. Для розыгрышей, выборок, игр и тестовых данных, где воспроизводимость является свойством, а не утечкой, это правильный инструмент.
- Зачем нужно зерно и почему числа каждый раз одни и те же?
- Зерно — это состояние, с которого начинается последовательность, поэтому одно и то же зерно всегда даёт один и тот же список. Это сделано намеренно: результат становится воспроизводимым, а это как раз то, что нужно, когда выборку надо передать другому, розыгрыш — прогнать заново на глазах у аудитории, а тестовый случай — удержать от дрейфа. Смените зерно — и получите другой список при тех же настройках. Если хочется, чтобы числа отличались каждый раз, меняйте зерно между запусками: введённое значение записывается вместе с результатом, поэтому понравившийся список всегда можно восстановить.
- Почему повторы всё-таки появляются, когда они разрешены?
- Потому что каждое вытягивание независимо. Когда повторы разрешены, каждая позиция выбирает одно из значений диапазона, не глядя на то, что выбрали другие позиции, и это честная модель для броска кубика или лотерейного барабана, возвращающего шар на место. Шанс повтора на панели — это ровно вероятность того, что совпадёт хотя бы одна пара: около 9,65 % для пяти вытягиваний из ста значений и больше 50 %, как только вы вытягиваете 23 значения из 365. Выключайте повторы, когда одно и то же значение не должно появиться дважды, — такова форма лотереи, выборки из списка или перемешанного порядка.
- Шанс повтора уменьшится, если запретить повторы?
- Нет, и панель намеренно продолжает показывать то же число. Оно отвечает на вопрос, который вы в действительности задаёте, щёлкая этим переключателем: насколько вероятно было бы совпадение, если бы повторы были разрешены. Для шести чисел от 1 до 49 это 27,26 %, так что запрет повторов устраняет настоящий риск, а не теоретический. Это же объясняет, почему выборка без повторов при больших количествах становится медленной и в конце концов невозможной: как только количество превышает число значений в диапазоне, допустимого ответа нет вовсе, и страница сообщает об этом, а не возвращает список покороче.
- Сколько чисел можно получить зараз и в каком диапазоне?
- До 200 чисел за запуск, а концы диапазона должны быть целыми, причём минимум не больше максимума. Сами значения могут быть отрицательными, поэтому диапазон от −50 до 50 годится. Нецелые концы отклоняются, а не округляются: с запретом повторов вытягивание из диапазона, содержащего дроби, превратило бы правило о повторах в пустое условие, а список, который выглядит правдоподобно и при этом молча игнорирует собственную настройку, хуже сообщения об ошибке.
- Числа отсортированы?
- Нет — они напечатаны в порядке вытягивания, и этот порядок является частью результата. Сортировка выбросила бы информацию, которую одно и то же зерно как раз и должно воспроизводить, а она важна всюду, где позиция что-то значит, — например, при назначении перемешанного порядка или при раздаче карт. Если нужна упорядоченная выборка, отсортируйте список сами после копирования; сама раздача остаётся верной той последовательности, которую породило зерно.
Источники
- SP 800-90A Rev. 1, Recommendation for Random Number Generation Using Deterministic Random Bit Generators — National Institute of Standards and Technology (NIST), Computer Security Resource Center
- Math.random() — JavaScript reference (a built-in generator with no seed parameter, and the explicit warning that it is not cryptographically secure) — MDN Web Docs, Mozilla
- Birthday Problem — from Wolfram MathWorld (the probability that a group drawn from a pool contains a repeated value, 1 − the falling-factorial product over the pool size) — Wolfram MathWorld