Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в AppGallery >>

VBA Excel. Псевдослучайные и случайные числа

    Ряды псевдослучайных чисел с одинаковым начальным значением, сгенерированных функцией Rnd в среде VBA Excel. Непредсказуемые случайные числа.

    Псевдослучайные числа в VBA Excel

    В среде VBA Excel для генерации случайных чисел традиционно используется функция Rnd. Однако важно знать, что такие числа не являются по-настоящему случайными. Они формируются с помощью детерминированного алгоритма — генератора псевдослучайных чисел — PRNG (Pseudo-Random Number Generator).

    Это означает, что при одинаковых исходных условиях (начальном значении, или seed-номере) последовательность чисел будет полностью воспроизводимой.

    Почему «случайность» не всегда случайна

    Два одинаковых «случайных» ряда

    Скопируйте процедуру, создающую одинаковые псевдослучайные последовательности, в стандартный модуль и запустите её:

    Перед запуском процедуры (можно и после) присвойте столбцам A и B числовой формат с 16 знаками после запятой.

    Как работает эта процедура

    1. Rnd -1 — сбрасывает внутреннее состояние генератора.
    2. Randomize 7 — задаёт фиксированное начальное значение (seed = 7).
    3. Первый цикл генерирует вертикальный ряд из 100 псевдослучайных чисел в столбце A.
    4. Затем процесс полностью повторяется:
      • генератор снова сбрасывается,
      • задаётся то же начальное значение,
      • генерируется та же последовательность, но только в столбце B.

    Результат: последовательности псевдослучайных чисел в столбцах A и B полностью идентичны.

    Ррезультат работы кода:

    Две одинаковые последовательности псевдослучайных чисел

    Почему так происходит

    Алгоритм PRNG работает по формуле вида:
    Xₙ₊₁ = f(Xₙ)
    Где:

    • Xₙ — текущее число,
    • f — математическая функция,
    • X₀ — начальное значение (seed).

    Если X₀ одинаково у всех последовательностей → все последовательности одинаковы.

    Особенности применения псевдослучайных чисел

    Когда псевдослучайность полезна

    Псевдослучайность является хорошим инструментом при:

    • тестировании воспроизводимых результатов;
    • отладке различных алгоритмов;
    • моделировании некоторых игровых процессов, не требовательных к высокой честности.

    Когда псевдослучайность проблематична

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

    • в криптографии;
    • для генерации паролей;
    • в играх с высокой требовательностью к честности;
    • в научных вычислениях, где требуются настоящие случайные числа.

    Как улучшить псевдослучайность

    Для улучшения псевдослучайности используйте Randomize без аргумента:

    В этом случае начальное значение (seed) вычисляется из текущих показаний системного таймера.

    Для всех повседневных задач в VBA Excel достаточно Randomize без аргумента — он даёт достаточно непредсказуемый seed.

    Настоящие случайные числа в VBA Excel

    Системный криптографический генератор

    Операционные системы собирают энтропию из непредсказуемых физических процессов и событий, происходящих внутри компьютера (аппаратные прерывания и датчики, сетевая активность, специальные инструкции ЦП). В Windows за это отвечает RtlGenRandom (он же SystemFunction036 из advapi32.dll). Он доступен в VBA Excel через Windows API и выдаёт криптографически стойкие байты.

    Функция, возвращающая случайное число от 0 до 1 с криптографической энтропией:

    Системный криптографический генератор не требует интернета, работает быстро, соответствует стандартам CSPRNG.

    Если вы хотите, чтобы случайное число обновлялось в ячейке при нажатии клавиши F9 и при внесении изменений в другие ячейки, раскомментируйте строку Application.Volatile True.

    Внешние источники случайности

    Если требуется максимальная энтропия, можно использовать внешние онлайн-источники случайности. Сервис https://api.random.org предоставляет истинную случайность на основе атмосферного радиошума. Идеально подходит для розыгрышей, когда нужна независимая от системы энтропия.

    Но в среде VBA Excel это требует интеграции через объект MSXML2.XMLHTTP (MSXML2.ServerXMLHTTP60), как, например, для получения точного местного времени с учётом часового пояса.

    Практические рекомендации

    Выбирайте подход к генерации случайных и псевдослучайных чисел в зависимости от поставленной задачи:

    Задача Рекомендуемый метод
    Простая рандомизация в Excel Rnd
    Повторяемые тесты Randomize seed + Rnd
    Более качественная случайность Randomize + Rnd
    Безопасность / криптография Windows API (RtlGenRandom)

    Функция Rnd в VBA Excel — это инструмент псевдослучайной генерации, а не источник истинной случайности. Понимание механизма работы генератора позволяет:

    • избегать логических ошибок,
    • контролировать воспроизводимость,
    • выбирать правильный уровень случайности под конкретную задачу.

    Если нужна реальная случайность — используйте встроенные или внешние криптографические генераторы.


    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.