Рандомизация
Что вы изучите
В этой лабораторной вы разберете, как работает "случайность" в компьютерах, и научитесь выбирать подходящий источник случайных чисел под задачу:
- обычная бизнес-логика и игры;
- статистическое моделирование;
- криптография и токены безопасности.
Главные понятия
- PRNG (псевдослучайный генератор) — алгоритм, который генерирует последовательность из начального состояния.
- Seed — начальное значение генератора; одинаковый seed дает одинаковую последовательность.
- CSPRNG — криптографически стойкий генератор, устойчивый к предсказанию по наблюдаемым выходам.
- Распределение — закон, по которому появляются значения (равномерное, нормальное и т.д.).
- Воспроизводимость — способность повторить эксперимент и получить те же результаты.
Ключевая идея: "случайность" в большинстве приложений детерминирована, но статистически полезна.
Пошаговая лабораторная
Шаг 1. Сравните фиксированный и случайный seed
- Запустите генератор с
seed = 42и сохраните первые 20 значений. - Перезапустите и повторите.
- Запустите без фиксированного seed.
Ожидаемый результат:
- с фиксированным seed последовательность совпадает;
- без фиксированного seed — отличается между запусками.
Шаг 2. Проверьте качество распределения
- Сгенерируйте не менее 100000 значений в диапазоне, например
[1..10]. - Постройте частоты по каждому значению.
- Оцените отклонения от равномерного распределения.
Цель — понять, что "визуально случайно" не всегда значит "статистически корректно".
Шаг 3. Проверьте зависимость между соседними значениями
- Возьмите пары
(x_i, x_{i+1}). - Проверьте корреляцию или визуальный паттерн на scatter-диаграмме.
Если генератор слабый, появляются закономерности.
Шаг 4. Сравните PRNG и CSPRNG
Для одной и той же задачи (например, генерация 1 млн чисел):
- измерьте скорость PRNG;
- измерьте скорость CSPRNG;
- оцените, где важнее производительность, а где предсказуемость недопустима.
Шаг 5. Примените на прикладном кейсе
Смоделируйте один практический сценарий:
- loot-table в игре,
- A/B-распределение пользователей,
- генерация одноразового токена.
Покажите, почему для этих сценариев нужны разные источники случайности.
Мини-примеры по языкам
Python
JavaScript (Node.js)
.NET
Как выбрать генератор на практике
- Симуляции, игры, тестовые данные: PRNG с фиксируемым seed.
- Ключи, токены, пароли, nonce: только CSPRNG.
- ML-эксперименты: фиксируйте seed ради воспроизводимости, но документируйте версию библиотек и платформу.
Простое правило: если предсказуемость создает риск безопасности — PRNG не подходит.
Типичные ошибки
- Использовать
Math.random()илиrand()для токенов авторизации. - Не фиксировать seed в научных/ML-экспериментах.
- Думать, что один удачный прогон доказывает "случайность".
- Сравнивать генераторы без контроля окружения и объема выборки.
Что должно быть в вашем отчете
- Использованные генераторы и их назначение.
- Параметры экспериментов (seed, объем выборки, среда).
- Статистические результаты и визуализация частот.
- Сравнение скорости PRNG/CSPRNG.
- Практические рекомендации по выбору генератора в проектах.
Такой отчет полезен команде: он помогает одинаково понимать, где нужна воспроизводимость, а где — криптографическая стойкость.