Рандомизация


Что вы изучите

В этой лабораторной вы разберете, как работает "случайность" в компьютерах, и научитесь выбирать подходящий источник случайных чисел под задачу:

  • обычная бизнес-логика и игры;
  • статистическое моделирование;
  • криптография и токены безопасности.

Главные понятия

  • PRNG (псевдослучайный генератор) — алгоритм, который генерирует последовательность из начального состояния.
  • Seed — начальное значение генератора; одинаковый seed дает одинаковую последовательность.
  • CSPRNG — криптографически стойкий генератор, устойчивый к предсказанию по наблюдаемым выходам.
  • Распределение — закон, по которому появляются значения (равномерное, нормальное и т.д.).
  • Воспроизводимость — способность повторить эксперимент и получить те же результаты.

Ключевая идея: "случайность" в большинстве приложений детерминирована, но статистически полезна.


Пошаговая лабораторная

Шаг 1. Сравните фиксированный и случайный seed

  1. Запустите генератор с seed = 42 и сохраните первые 20 значений.
  2. Перезапустите и повторите.
  3. Запустите без фиксированного seed.

Ожидаемый результат:

  • с фиксированным seed последовательность совпадает;
  • без фиксированного seed — отличается между запусками.

Шаг 2. Проверьте качество распределения

  1. Сгенерируйте не менее 100000 значений в диапазоне, например [1..10].
  2. Постройте частоты по каждому значению.
  3. Оцените отклонения от равномерного распределения.

Цель — понять, что "визуально случайно" не всегда значит "статистически корректно".


Шаг 3. Проверьте зависимость между соседними значениями

  1. Возьмите пары (x_i, x_{i+1}).
  2. Проверьте корреляцию или визуальный паттерн на 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-экспериментах.
  • Думать, что один удачный прогон доказывает "случайность".
  • Сравнивать генераторы без контроля окружения и объема выборки.

Что должно быть в вашем отчете

  1. Использованные генераторы и их назначение.
  2. Параметры экспериментов (seed, объем выборки, среда).
  3. Статистические результаты и визуализация частот.
  4. Сравнение скорости PRNG/CSPRNG.
  5. Практические рекомендации по выбору генератора в проектах.

Такой отчет полезен команде: он помогает одинаково понимать, где нужна воспроизводимость, а где — криптографическая стойкость.