Ряды псевдослучайных чисел с одинаковым начальным значением, сгенерированных функцией Rnd в среде VBA Excel. Непредсказуемые случайные числа.
Псевдослучайные числа в VBA Excel
В среде VBA Excel для генерации случайных чисел традиционно используется функция Rnd. Однако важно знать, что такие числа не являются по-настоящему случайными. Они формируются с помощью детерминированного алгоритма — генератора псевдослучайных чисел — PRNG (Pseudo-Random Number Generator).
Это означает, что при одинаковых исходных условиях (начальном значении, или seed-номере) последовательность чисел будет полностью воспроизводимой.
Почему «случайность» не всегда случайна
Два одинаковых «случайных» ряда
Скопируйте процедуру, создающую одинаковые псевдослучайные последовательности, в стандартный модуль и запустите её:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub СравнениеРядовПсевдослучайныхЧисел() Application.ScreenUpdating = False Dim i As Long Rnd -1 Randomize 7 For i = 1 To 100 Cells(i, 1).Value = Rnd Next i Rnd -1 Randomize 7 For i = 1 To 100 Cells(i, 2).Value = Rnd Next i Application.ScreenUpdating = True End Sub |
Перед запуском процедуры (можно и после) присвойте столбцам A и B числовой формат с 16 знаками после запятой.
Как работает эта процедура
Rnd -1— сбрасывает внутреннее состояние генератора.Randomize 7— задаёт фиксированное начальное значение (seed = 7).- Первый цикл генерирует вертикальный ряд из 100 псевдослучайных чисел в столбце
A. - Затем процесс полностью повторяется:
- генератор снова сбрасывается,
- задаётся то же начальное значение,
- генерируется та же последовательность, но только в столбце
B.
Результат: последовательности псевдослучайных чисел в столбцах A и B полностью идентичны.
Ррезультат работы кода:

Почему так происходит
Алгоритм PRNG работает по формуле вида:
Xₙ₊₁ = f(Xₙ)
Где:
Xₙ— текущее число,f— математическая функция,X₀— начальное значение (seed).
Если X₀ одинаково у всех последовательностей → все последовательности одинаковы.
Особенности применения псевдослучайных чисел
Когда псевдослучайность полезна
Псевдослучайность является хорошим инструментом при:
- тестировании воспроизводимых результатов;
- отладке различных алгоритмов;
- моделировании некоторых игровых процессов, не требовательных к высокой честности.
Когда псевдослучайность проблематична
Псевдослучайность неприменима:
- в криптографии;
- для генерации паролей;
- в играх с высокой требовательностью к честности;
- в научных вычислениях, где требуются настоящие случайные числа.
Как улучшить псевдослучайность
Для улучшения псевдослучайности используйте Randomize без аргумента:
|
1 2 |
Randomize x = Rnd |
В этом случае начальное значение (seed) вычисляется из текущих показаний системного таймера.
Для всех повседневных задач в VBA Excel достаточно Randomize без аргумента — он даёт достаточно непредсказуемый seed.
Настоящие случайные числа в VBA Excel
Системный криптографический генератор
Операционные системы собирают энтропию из непредсказуемых физических процессов и событий, происходящих внутри компьютера (аппаратные прерывания и датчики, сетевая активность, специальные инструкции ЦП). В Windows за это отвечает RtlGenRandom (он же SystemFunction036 из advapi32.dll). Он доступен в VBA Excel через Windows API и выдаёт криптографически стойкие байты.
Функция, возвращающая случайное число от 0 до 1 с криптографической энтропией:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Private Declare PtrSafe Function RtlGenRandom Lib "advapi32.dll" Alias "SystemFunction036" _ (ByRef RandomBuffer As Byte, ByVal RandomBufferLength As Long) As Long Public Function СлучайноеЧисло() As Double ' Возвращает число от 0 до 1 с криптографической энтропией ' Application.Volatile True Dim buf(0 To 7) As Byte If RtlGenRandom(buf(0), 8) = 0 Then Err.Raise 1001, , "Ошибка системного генератора случайных чисел" End If ' Преобразуем 8 байт в Double (64 бита) и нормализуем Dim val As Double Dim i As Long For i = 0 To 7 val = val + buf(i) * (256 ^ i) Next i ' Нормализация в диапазон [0, 1) СлучайноеЧисло = (val / 1.84467440737096E+19) ' 2^64 End Function |
Системный криптографический генератор не требует интернета, работает быстро, соответствует стандартам 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 — это инструмент псевдослучайной генерации, а не источник истинной случайности. Понимание механизма работы генератора позволяет:
- избегать логических ошибок,
- контролировать воспроизводимость,
- выбирать правильный уровень случайности под конкретную задачу.
Если нужна реальная случайность — используйте встроенные или внешние криптографические генераторы.