ЛЕКЦИЯ
Случайность
в программировании
от молний и урана до rand() и random.choice()
ПСЕВДОСЛУЧАЙНОСТЬ  ·  ЭНТРОПИЯ  ·  ГЕНЕРАТОРЫ
01
Раздел 01
Зачем нужна случайность?
В программировании часто требуется получить число, которое невозможно заранее предсказать. Такие значения называют случайными.
Случайность используется во множестве задач:
> игры
случайный лут, генерация мира, поведение NPC
> криптография
ключи шифрования, токены, одноразовые пароли
> моделирование
физические процессы, метод Монте-Карло
> статистика
выборки, машинное обучение
> алгоритмы
рандомизированные алгоритмы, оптимизация
> тестирование
fuzz testing, генерация тестовых данных
01
Раздел 01 · продолжение
Простой пример: игра
Без случайности
Враг всегда выпадает с одинаковым предметом.

Игра быстро становится предсказуемой и скучной.
Со случайностью
Предмет выбирается случайно из таблицы лута.

Игровой процесс становится разнообразным.
Ключевой вопрос
Что значит «случайное число» для компьютера? Может ли детерминированная машина создавать настоящую случайность?
02
Раздел 02
Истинная случайность
Истинная случайность возникает в физических процессах, которые невозможно точно предсказать.
Примеры недетерминированных процессов:
  • радиоактивный распад атомов
  • шум электронных схем
  • атмосферные процессы
  • движение фотонов
  • молнии
Определение
Эти процессы считаются недетерминированными — даже при полном знании состояния системы невозможно точно предсказать результат. Для получения настоящей случайности используют аппаратные генераторы — TRNG (True Random Number Generator).
02
Раздел 02 · энтропия
Что такое энтропия?
Энтропия — это мера неопределённости, непредсказуемости информации. Чем выше энтропия, тем сложнее предсказать следующее значение.
Низкая энтропия
Данные предсказуемы и содержат мало «сюрпризов».

Пример: последовательность
0 0 0 0 0 0 0 0

Легко угадать следующий элемент.
Высокая энтропия
Данные хаотичны, каждое значение — неожиданность.

Пример: последовательность
1 0 1 1 0 0 1 0

Невозможно предсказать следующий бит.
В контексте генерации случайных чисел энтропия — это количество «настоящей случайности», собранной из внешних источников.
Зачем это важно
Генератор случайных чисел работает хорошо только тогда, когда у него достаточно энтропии. Без качественного источника энтропии даже лучший алгоритм будет выдавать предсказуемые результаты. Источники энтропии: движение мыши, тайминги нажатий клавиш, сетевые задержки, аппаратный шум.
02
Раздел 02 · продолжение
Псевдослучайность
Компьютер — это детерминированная машина. Если входные данные одинаковые, результат будет одинаковым.
Поэтому большинство случайных чисел в программах — псевдослучайные.
Как работает PRNG
seed (начальное значение)
математическая формула
последовательность чисел
Последовательность выглядит случайной, но полностью определяется начальным значением.
Линейный конгруэнтный генератор
X(n+1) = (a · Xn + c) mod m
03
Раздел 03
Программирование, молнии
и распад урана
На первый взгляд программирование и физические процессы не связаны. Но именно физика часто используется для получения настоящей случайности.
☢ Радиоактивный распад
Момент распада атома урана невозможно предсказать. Фиксируем моменты распада → переводим в биты → настоящие случайные числа.
⚡ Атмосферный шум
Грозы, солнечная активность, молнии. Радиоприёмники фиксируют шум → поток случайных данных.
🔌 Электронный шум
Тепловой шум, квантовые флуктуации в электронных схемах. Колебания → источник энтропии.
04
Раздел 04
Cloudflare: лавовые лампы
Cloudflare защищает огромную часть интернета. Для криптографии им нужна максимально непредсказуемая энтропия.
В одном из офисов установлена стена из лавовых ламп. Камера постоянно фотографирует лампы.
Почему лавовые лампы?
  • жидкость движется хаотично
  • каждое движение уникально
  • освещение и температура меняются
Как это работает
камера фотографирует лампы
изображение → цифровые данные
данные → источник энтропии
04
Раздел 04 · продолжение
Другие источники: водопады
Позже Cloudflare добавила другие источники энтропии. В одном из дата-центров камера направлена на водопад.
  • движение воды хаотично
  • каждая капля движется по уникальной траектории
  • изображение постоянно меняется
Ключевая идея
Физический хаос можно использовать для генерации цифровой случайности. Природные процессы → камера → биты → криптография.
05
Раздел 05
Где используется случайность
🔐 Криптография
Самое важное применение — безопасность.
  • генерация ключей
  • токены аутентификации
  • одноразовые пароли
  • криптографические протоколы
Если генератор слабый — систему можно взломать.
🎮 Компьютерные игры
Случайность создаёт разнообразие.
  • генерация уровней
  • поведение NPC
  • распределение наград
  • процедурная генерация мира
roguelike Minecraft No Man's Sky
05
Раздел 05 · продолжение
Моделирование и тестирование
📊 Метод Монте-Карло
Использует случайные числа для моделирования сложных систем.
Применяется в:
  • физике
  • экономике и финансах
  • биологии
  • вычислении интегралов
🧪 Тестирование программ
Случайные данные помогают находить ошибки.
  • fuzz testing
  • генерация случайных входных данных
  • стресс-тестирование
AFL libFuzzer random input
06
Раздел 06
Случайность в языке C
Базовое использование
#include <stdio.h> #include <stdlib.h> int main() { int r = rand(); printf("%d\n", r); }
Без установки seed последовательность будет одинаковой при каждом запуске.
Инициализация seed
#include <stdlib.h> #include <time.h> srand(time(NULL)); // текущее время как seed
Число в диапазоне 0..9
rand() % 10; // даёт число от 0 до 9
⚠ Недостаток
rand() имеет слабую статистику и непригоден для криптографии.
07
Раздел 07
Случайность в языке Python
Модуль random
import random print(random.random()) # число от 0.0 до 1.0
Основные функции
# случайное целое от 1 до 100 random.randint(1, 100) # случайный элемент списка random.choice(['a', 'b', 'c']) # перемешать список на месте random.shuffle(my_list)
Для криптографии — модуль secrets
import secrets # криптостойкий токен token = secrets.token_hex(32) # случайное число в диапазоне secrets.randbelow(100) # случайный выбор из списка secrets.choice(['x', 'y', 'z'])
08
Раздел 08
Случайность в языке C#
Класс Random
Random rnd = new Random(); int value = rnd.Next(0, 10); Console.WriteLine(value);
Доступные методы
// случайное неотрицательное int rnd.Next(); // от min до max - 1 rnd.Next(1, 101); // дробное от 0.0 до 1.0 rnd.NextDouble(); // заполнить массив байтов случайными данными byte[] buffer = new byte[16]; rnd.NextBytes(buffer);
Рекомендация
Создавайте один объект генератора и переиспользуйте его. Создание нескольких объектов подряд может привести к одинаковому seed и повторяющимся последовательностям.
09
Раздел 09
Проблемы генераторов
Плохой генератор может привести к серьёзным последствиям:
🔄 Повторения
Короткий период генератора приводит к повторяющимся последовательностям
🎯 Предсказуемость
Слабый алгоритм позволяет вычислить следующие числа по предыдущим
📉 Искажения
Неравномерное распределение нарушает статистические свойства
Реальные последствия
  • взлом криптографических систем
  • предсказание игровых событий
  • ошибки в научном моделировании
В серьёзных системах используют: криптографические генераторы и аппаратные источники случайности.
10
Раздел 10
Итоги
Случайность — фундаментальный инструмент современной информатики.
Мы рассмотрели:
  • различие между истинной и псевдослучайностью
  • понятие энтропии и её роль в генерации
  • связь программирования с физическими явлениями
  • реальные источники: молнии, радиацию, электронный шум
  • пример Cloudflare: лавовые лампы и водопады
  • генерацию случайных чисел в C, Python, C#
  • проблемы и ограничения генераторов
Вывод
Несмотря на детерминированную природу компьютеров, сочетание математических алгоритмов и физических источников позволяет создавать системы, обеспечивающие практически непредсказуемую случайность.
КОНЕЦ ЛЕКЦИИ
Спасибо
за внимание
вопросы
1 / 17