Разница между физической случайностью и алгоритмом
Истинный генератор случайных чисел опирается на физические процессы внешнего мира. Такие устройства считывают тепловой шум микросхем, радиоактивный распад изотопов или квантовые колебания электромагнитного поля. Полученные данные переводятся в биты, давая абсолютно непредсказуемый результат. Компьютер сам по себе — строго детерминированная машина. Его кремниевые транзисторы выполняют инструкции с абсолютной точностью, поэтому внутри процессора нет встроенного источника природного хаоса.
Для большинства прикладных задач истинная случайность избыточна и создает технические проблемы. Аппаратные генераторы работают медленно, требуют отдельного кремниевого блока и могут исчерпать энтропию в операционной системе при слишком частых запросах. Если современная игра обратится к физическому датчику шума несколько сотен тысяч раз за секунду, частота кадров упадет до нуля.
Генераторы псевдослучайных чисел работают иначе. Это математические формулы, которые берут стартовое число, называемое сидом, и прогоняют его через цепочку арифметических операций: умножение на большие простые числа, битовые сдвиги и деление с остатком. Результат каждого шага становится основой для следующего вычисления. Последовательность выглядит случайной для игрока, но подчиняется строгому математическому закону.
Почему игровой разработке необходима предсказуемость
Главное преимущество псевдослучайности кроется в детерминизме. Зная формулу и начальное число, разработчик может в любой момент повторить абсолютно ту же цепочку событий вплоть до каждого броска кубика.
Это свойство решает ключевые инженерные задачи индустрии:
- Компактная генерация громадных игровых миров без хранения терабайтов текстур и геометрии на накопителе игрока.
- Быстрая сетевая синхронизация, при которой сервер и клиенты передают друг другу только стартовые условия и действия игроков, а сложные симуляции физики рассчитывают параллельно на каждом устройстве.
- Отладка редких багов, когда тестировщик берет проблемный сид и шаг за шагом воспроизводит поведение искусственного интеллекта и физических тел.
- Запись и воспроизведение матчей минимальным размером файла, содержащего только перемещения мыши и тайминги нажатия клавиш.
Популярные алгоритмы в игровых движках
В старых играх и базовых библиотеках языков программирования C и C++ десятилетиями применяли линейный конгруэнтный метод. Формула умножает предыдущее значение на константу, прибавляет вторую константу и берет остаток от деления на модуль. Метод требует всего пару процессорных тактов, но страдает сильной корреляцией младших битов и быстро начинает повторять свои паттерны в многомерных пространствах.
Современные движки вроде Unreal Engine и Unity перешли на более надежные решения. Долгое время стандартом оставался Вихрь Мерсенна, обладающий гигантским периодом повторения, равным двум в степени 19937 минус один. Его единственный недостаток заключается в относительно тяжелом внутреннем состоянии, требующем около 2,5 килобайт памяти.
Сегодня в высоконагруженных игровых системах чаще используют семейство xoshiro и PCG. Они обходятся крошечным состоянием в 64 или 128 бит, опережают старые алгоритмы по тактовой частоте процессора и проходят тяжелейшие статистические тесты на равномерность распределения.
Взлом генераторов и спидраннинг
Поскольку алгоритм лишен квантовой случайности, его можно обратить вспять. Это явление называют манипуляцией генератором чисел. В классических частях Pokemon на Game Boy Advance и ранних Final Fantasy продвинутые спидраннеры точно знают, как процессор обновляет счетчик при каждом шаге героя или взмахе меча.
Игроки выполняют строго выверенную серию движений в пустых комнатах, прокручивая внутреннее состояние формулы вперед. В результате персонаж гарантированно встречает редчайшего монстра на следующем шаге или наносит критический удар с шансом один к десяти тысячам. Для киберспорта и многопользовательских проектов такие уязвимости опасны, поэтому серверы современных игр периодически подмешивают в формулу дополнительную системную энтропию.
Частые вопросы
Можно ли взломать генератор случайных чисел в онлайн-играх?
В соревновательных сетевых проектах вроде CS:GO или Dota 2 это исключено. Генератор работает на закрытом сервере разработчиков, а клиент получает только готовый результат расчета попадания или выпадения предметов.
Откуда алгоритм берет самое первое число для старта?
Если разработчики не фиксируют сид специально, игра берет текущее системное время в миллисекундах или микросекундах, позицию курсора мыши и температуру чипа в момент запуска.
Почему в криптографии псевдослучайные алгоритмы из игр запрещены?
Игровые формулы оптимизированы под предельную скорость и минимальную нагрузку на процессор. Зная несколько подряд выпавших чисел из такого алгоритма, злоумышленник быстро вычисляет внутреннее состояние генератора и взламывает ключ шифрования.
Что будет, если в игре кончатся псевдослучайные числа?
Они не закончатся, а пойдут по второму кругу. У каждого алгоритма есть период полного цикла: у современных формул он настолько огромен, что на его прохождение уйдут триллионы лет непрерывной работы процессора.