Недавно меня попросили написать отзыв на автореферат кандидатской диссертации, в которой обсуждалось моделирование случайных величин с использованием Python и C++. Я разбираюсь в моделировании, но не в программировании. Обсуждая работу, я поинтересовался у соискателя, почему он выбрал эти инструменты и не рассматривал ли Excel. Он ответил, что в их среде Excel не используется. «А жаль», — подумал я. Особенно учитывая, что в работе выборки не превышали сотни элементов. Excel легко справляется даже с миллионом и имеет десятки встроенных функций для таких целей.
В этой статье в блоге ЛАНИТ я покажу, как с помощью Excel можно эффективно генерировать случайные величины различных распределений и почему этот инструмент не стоит недооценивать.

С появлением в Excel 2019 новых функций массива генерация случайных чисел существенно упростилась. В Excel также есть десятки статистических функций, возвращающих значения разнообразных распределений, а современные ПК быстро создадут выборку даже в миллион значений. Так почему же не использовать этот широко распространенный инструмент?
В основе моделирования любых распределений лежит равномерное распределение. С него и начнем.
Равномерное распределение
Распределение вероятностей называют равномерным, если на интервале [a, b], которому принадлежат все возможные значения случайной величины X, плотность распределения сохраняет постоянное значение.
Плотность равномерного распределения:
Наиболее интересен случай, когда . Такое равномерное распределение называют стандартным (рис. 1а):
![Рис. 1. Теоретические кривые для непрерывной случайной величины , распределенной равномерно в интервале [0, 1]: (а) плотность вероятности, (б) функция распределения Изображение выглядит как линия, диаграмма, Прямоугольник, График Автоматически созданное описание](https://habrastorage.org/getpro/habr/upload_files/40a/838/0f4/40a8380f47957b1b73890fcc7d6477c3.jpeg)
Интегрируя плотность вероятности (1.2), получаем функцию распределения (рис. 1б):
Процедура в Excel для каждого распределения будет включать:
генерацию массива случайных чисел,
подсчет случайных чисел, попадающих в карманы (они же диапазоны),
построение кривой (или гистограммы) плотности вероятности,
нахождение среднего значения и стандартного отклонения и сравнение с теоретическими значениями для верификации процесса генерации.
Чтобы разыграть (сгенерировать) непрерывную стандартную равномерно распределенную случайную величину в Excel используем формулу:
Здесь – размер выборки,
– минимальное значение,
– максимальное значение,
– задает плотность вероятности (
задала бы функцию распределения). В результате получим вертикальный массив из
десятичных значений в диапазоне от
до
(рис. 2а).

Для построения гистограммы нужно выбрать интервалы конечной ширины (рис. 2б). Вероятность попадания величины (в результате испытания) в интервал
, принадлежащий интервалу
, равна его длине:
Например, разбивая интервал на 10 равных частей мы получим вероятность случайной величины Х попасть в один из отрезков
(рис. 2в). Если разбить интервал
на 20 равных частей столбцы гистограммы выстроятся на высоте 5%. Вот почему диаграммы плотности вероятности иногда строят без указания чисел по оси ординат.
В приложенном архиве вы найдете Excel-файлы, использованные для моделирования и построения диаграмм. Для уменьшения объема файлов я сохранил их со значением
.
Параметры распределения и статистики выборки
В статистике генеральную совокупность описывают параметрами, обозначаемыми греческими буквами: математическое ожидание , среднеквадратичное отклонение
. Выборки описывают статистиками, обозначаемыми латинскими буквами: среднее арифметическое (или просто среднее)
, стандартное отклонение
.
В реальной жизни ни матожидание , ни среднеквадратичное отклонение
генеральной совокупности неизвестны. Но, извлекая выборку, мы кое-что узнаем о матожидании и среднеквадратичном отклонении. Говорят, что среднее
является оценкой матожидания
, а стандартное отклонение
— оценкой среднеквадратичного отклонения
.
В настоящей заметке параметры генеральной совокупности известны. Их мы используем в формулах Excel при генерации случайных чисел. А получив выборку, мы вычисляем статистики, которые не должны сильно отличаться от параметров.
Матожидание равномерного распределения:
Матожидание стандартного равномерного распределения:
Дисперсия равномерного распределения:
Среднеквадратичное отклонение стандартного равномерного распределения:
Теоретические значения параметров генеральной совокупности и статистики выборки для стандартного равномерного распределения приведены в верхней правой части рис. 2. Мы будем проверять адекватность выборки, сравнивая статистики с параметрами генеральной совокупности.
Статистические функции Excel
В Excel в разделе статистических функций представлено два десятка функций непрерывных распределений. Большинство из них парные, но не все:

Некоторые распределения представлены большим числом функций. Например, СТЬЮДЕНТ.РАСП, СТЬЮДЕНТ.РАСП.2Х, СТЬЮДЕНТ.РАСП.ПХ. Для наших целей достаточно одного представителя от семейства. Рассмотрим структуру функций на примере пары НОРМ.СТ.РАСП и НОРМ.СТ.ОБР.
Синтаксис:
=НОРМ.СТ.РАСП(;ЛОЖЬ) — возвращает плотность вероятности стандартного нормального распределения (рис. 4а);
=НОРМ.СТ.РАСП(;ИСТИНА) — возвращает [интегральную] функцию стандартного нормального распределения (рис. 4б);
=НОРМ.СТ.ОБР — возвращает обратное значение стандартного нормального распределения (рис. 4в). Обратите внимание на аргумент функции —
, вероятность.

Аналогично устроены все функции в таблице на рис. 3. Функции с суффиксом РАСП позволяют строить плотность вероятности и функцию распределения, выбирая соответствующий последний аргумент, а функции с суффиксом ОБР — находить значение распределения по его вероятности. Последние используются для разыгрывания случайной величины.
Алгоритм прост: записываем формулу на основе функции с суффиксом ОБР и вместо одного значения вероятности р подставляем случайный массив десятичных значений от 0 до 1 (рис. 5а).

В таблице на рис. 3 представлены 8 функций с суффиксом ОБР, которые можно использовать для генерирования случайных величин, что называется «из коробки»: F.ОБР, БЕТА.ОБР, ГАММА.ОБР, ЛОГНОРМ.ОБР, НОРМ.ОБР, НОРМ.СТ.ОБР и СТЬЮДЕНТ.ОБР.
НОРМ.ОБР, НОРМ.СТ.ОБР я описал выше.
Оставшиеся шесть функций:

Если в Excel нет готовой функции для генерирования распределения, можно попробовать найти обратную функцию аналитически.
Метод обратной функции
Пусть требуется разыграть непрерывную случайную величину , т. е. получить последовательность ее возможных значений
, зная функцию распределения
.
Если — случайное число в диапазоне
, то возможное значение
разыгрываемой непрерывной случайной величины
с заданной функцией распределения
, соответствующее
, является корнем уравнения
.
Так как в интервале всех возможных значений функция распределения
монотонно возрастает от 0 до 1, то в этом интервале существует, причем только одно, такое значение аргумента
при котором функция распределения примет значение
. Другими словами, уравнение
имеет единственное решение:
где — функция, обратная функции
.
Например, для стандартного нормального распределения функции и
представлены на рис. 4б и 4в. Не всегда (более того, лишь изредка) уравнение
удается решить в явном виде относительно
. Начнем с примера, когда случайная величина
распределена по показательному закону, заданному функцией распределения:
Требуется найти явную формулу для разыгрывания возможных значений . Используя правило
и явный вид функции распределения
можно записать:
Решим это уравнение относительно :
или
Отсюда
Случайное число заключено в интервале
; следовательно, число
также случайное и принадлежит интервалу
. Другими словами, величины
и
распределены одинаково. Поэтому для отыскания хi можно воспользоваться более простой формулой:

Это и есть наш генератор случайной величины, распределенной по экспоненте:

При распределении Лапласа (двойного экспоненциального) плотность вероятности случайной величины имеет вид
:
где θ — параметр сдвига (медиана распределения), – параметр масштаба (ширина распределения),
.
Распределение Лапласа с параметром называют стандартным. Его плотность вероятности:
Интегрируя , получаем функцию распределения:
Решая уравнения относительно
, получаем обратную функцию:

Вот еще несколько непрерывных распределений, для которых обратную функцию можно выразить аналитически.
Стандартное распределение Коши:
Стандартное распределение Вейбулла :
,
Стандартное логистическое распределение:
Стандартное распределение Чампернауна:

Довольно много обратных функций можно найти в классическом Справочнике по вероятностным распределениям Ратмира Николаевича Вадзинского.
Метод исключения
Также встречаются названия метод выборки с отклонением (Rejection Sampling), метод отбраковки, метод принятия-отклонения (Acceptance-Rejection Method), метод фильтрации и алгоритм Неймана (по имени автора).
Пусть есть случайная величина , имеющая плотность вероятности
и функцию распределения
, для которой не получается найти аналитическое выражение для
. Подберем вспомогательную функцию с плотностью вероятности
, для которой относительно легко разыграть случайную величину
по вероятности
, такую что
для всей области определения .
Для простоты в качестве можно взять функцию, распределенную равномерно на области определения
и проходящую через максимум функции
. Это легко сделать, если область определения
ограничена. Если же область определения
не ограничена, нужно задать границы принудительно.

Алгоритм метода включает три шага.
Сгенерируйте кандидата
из плотности
.
Сгенерируйте случайное число
из равномерного распределения
.
Проверьте условие
. Если оно выполняется, примите
, если нет, отклоните
и перейдите к шагу 1.
Следует помнить, что за пределами заданной области определения останутся значения , которые не появятся в вашей выборке. С другой стороны, чем шире вы зададите область определения, тем меньше значений будет в выборке. Это связано с тем, что на хвостах распределения значения
существенно меньше
и почти все разыгранные значения
будут отклонены.
Теоретическое обоснование метода исключения и много чего еще интересного по теме есть в Хабра-заметке Александра Самарина «Генераторы непрерывно распределенных случайных величин».
Разберем алгоритм в Excel на примере стандартного нормального распределения.

Пояснения модели Excel
В ячейках В2:В3 задаю границы области определения и
, значения
и
. В5:В6 — проверяю среднее значение и стандартное отклонение массива значений
, полученных методом исключения. В7:В8 — проверяю среднее значение и стандартное отклонение массива значений
, полученных с помощью функции НОРМ.СТ.ОБР(). D2 — разыгрываю аргумент функций
и
, случайное число
, распределенное равномерно на интервале от
до
. E2 — вычисляю значение
для
, где
— стандартное нормальное распределение F2 — вычисляю значение
, равное максимуму функции
. G2 — разыгрываю случайное число
, распределенное равномерно на интервале
. H2 – если
, возвращаю
, иначе «нет». I2— разыгрываю случайное число
, распределенное по стандартному нормальному распределению, используя функцию Excel «из коробки» НОРМ.СТ.ОБР(). K2 — задаю карманы (диапазоны) для построения диаграммы. L2 — в каждом диапазоне подсчитываю число разыгранных значений по методу исключения. M2 — в каждом диапазоне подсчитываю число разыгранных значений с помощью функции НОРМ.СТ.ОБР().
Напоследок рассмотрим интересную практическую задачу разыгрывания случайной величины.
Скорость сходимости центральной предельной теоремы
Год назад прочитал книгу Нассима Талеба «Статистические последствия жирных хвостов». Книга о математике, лежащей в основе историй Талеба, рассказанных в его предыдущих эссе. В частности автор показывает, что распределения с толстыми хвостами довольно медленно сходятся к нормальному в соответствии с центральной предельной теоремой (ЦПТ):
При конечной дисперсии случайных величин
, распределение суммы этих случайных величин
, нормированное на
, в пределе стремится к нормальному распределению.
Быстрая сходимость равномерного распределения
Если случайная величина равномерно распределена на отрезке
, плотность вероятности
будет постоянной и равной
. Поскольку я использовал
диапазонов, вероятность попасть в один из них равна
или 1% (
на рис. 13). Теперь добавим к
другую случайную величину
, независимую и с таким же распределением. У суммы
распределение будет другим! График плотности вероятности для суммы
стал треугольным. Добавим еще одну переменную, и плотность вероятности
для распределения суммы
станет колоколом. Нам достаточно 3–4 слагаемых, чтобы распределение
приняло вид нормального:

В Excel я разыграл случайную равномерно распределенную на отрезке [0,1] величину формулой:
.
Для генерации я использовал среднее двух массивов =
, и т. д.
Медленная сходимость распределения Парето
Плотность вероятности распределения Парето:
где — значение случайной величины,
— показатель распределения, он же параметр формы,
— минимальное значение, которое может принимать случайная величина.
Стандартное распределение Парето определено для на интервале
:
Для получаем:
А обратное распределение имеет вид:

Рассмотрим случайную величину , где каждое по отдельности
— независимая случайная величина, распределенная по (3.4). Посмотрим, с какой скоростью
сходится к нормальному распределению при росте
. Для разыгрывания случайной величины
используем сумму
обратных распределений
, деленную на
.
В Excel я применил формулу (авторство принадлежит AlienSx с форума Планета Excel):
где — размер выборки,
— число слагаемых, каждое из которых соответствует
, подробности во вложенном файле «15. ЦПТ. Парето, альфа 2.xlsx».

Центральная предельная теорема работает, но не так быстро, как ожидалось. Как говорит Насим Талеб: «Распределение Парето так и не приблизилось к гауссиане, хотя при
это произойдет — если у вас хватит терпения и вы будете жить долго-долго».
Вывод
Итак, мы рассмотрели, как с помощью Excel моделировать (разыгрывать) случайные величины с различными законами распределения. Выяснили, что для этого доступны встроенные функции, формулы на основе обратных функций или метод исключения. Оказывается, что возможностей Excel в целом ряде прикладных задач будет вполне достаточно без необходимости прибегать к программированию.
Оставляйте комментарии: мне будет интересно узнать, возникают ли у вас задачи генерации случайных чисел, в каких областях знаний, какие инструменты вы используете.
Комментарии (5)
CptAFK
11.02.2025 10:01Функция «СЛМАССИВ» доступна в Excel 365 и Excel 2021
Вы очень красиво функции преобразовали в фото, для удобства чтения это отлично, но в тексте вы не разу не упомянули злосчастную вышенаписанную функцию, что возможно не позволит поисковым системам спроводить до вашей статьи потенциально заинтересованного человека.
adeshere
Спасибо за статью, но:
> Метод исключения (...)
существенно меньше
и почти все разыгранные значения
будут отклонены.
...Это связано с тем, что на хвостах распределения значения
Метод, конечно, весьма соблазнительный в силу своей простоты. Настолько, что хочется его применять и вне Excell, где нет ограничений на размер выборки. Но если Вы будете это делать, то трижды проверьте "хвосты" получившейся выборки, прежде чем пускать ее в дело! Я вот однажды обжегся при решении очень похожей задачи. Я строил псевдослучайные временные ряды длиной всего-то в десяток миллиардов отсчетов. Сущая ерунда по сравнению с ожидаемым
периодом повторяемости ГСЧ
Даже если учесть, что я хотел нормальное распределение, а ГСЧ давал равномерное, из-за чего я фактически обращался к ГСЧ 6-12 раз в каждой точке, а потом суммировал полученные значения (ЦПТ!)
В общем, я даже не думал о возможной подставе. Пока внезапно не
обнаружил в своих сигналах квазипериодичность.
Так бы я ее никогда не заметил (там период порядка E+9), но мне пришлось раскапывать один баг, и по ходу дела я на эту квазипериодичность наткнулся
А потом мне попалась вот эта статья, из которой вполне очевидно, что в статистиках второго порядка неидеальность ГСЧ начинает прослеживаться гораздо раньше, если не принимать специальные меры.
Попросту говоря, если вы генерируете более-менее объемную выборку методом исключения (вызывая ГСЧ многократно большее число раз, чем потребный объем выборки), то при этом потенциально возможны всякие неожиданности.
Другой вопрос - насколько они способны исказить целевое распределение. Ответ я не знаю, но вообще было бы интересно, если кто-то такое расследование проведет...
SergBag Автор
Алексей, спасибо за комментарий))
Я когда писал статью, озаботился тем, какой алгоритм генерации случайных чисел (ГСЧ) использует Excel. Это алгоритм Mersenne Twister. Его период порядка Е+6000. Так что в Excel описанная вами проблема не возникла бы. Правда, Excel не справился бы с генераций миллиардов случайных чисел. Подробнее об эксельном ГСЧ https://chatgpt.com/share/67ab2aae-1f68-800f-b57d-1bf6578312e7
adeshere
Да, ГСЧ в современном Exctll явно лучше, чем в фортране 2008 года. Но в моем случае E+9 - это, конечно, не период повторяемости ГСЧ, а период возникновения определенных аномалий в моем сигнале. Причем это не точный период, а плавающий. И вот он на порядки меньше
периода повторяемости самого ГСЧ (около E+18)
RANDOM_NUMBER
Intrinsic Subroutine: Returns one pseudorandom number or an array of such numbers.
CALL RANDOM_NUMBER (harvest)
harvest
(Output) Must be of type real. It can be a scalar or an array variable. It is set to contain pseudorandom numbers from the uniform distribution within the range 0 <= x < 1.
The seed for the pseudorandom number generator used by RANDOM_NUMBER can be set or queried with RANDOM_SEED. If RANDOM_SEED is not used, the processor sets the seed for RANDOM_NUMBER to a processor-dependent value.
The RANDOM_NUMBER generator uses two separate congruential generators together to produce a period of approximately 10**18, and produces real pseudorandom results with a uniform distribution in (0,1). It accepts two integer seeds, the first of which is reduced to the range [1, 2147483562]. The second seed is reduced to the range [1, 2147483398]. This means that the generator effectively uses two 31-bit seeds.
For more information on the algorithm, see the following:
Communications of the ACM vol 31 num 6 June 1988, titled: Efficient and Portable Combined Random Number Generators by Pierre L'ecuyer.
Springer-Verlag New York, N. Y. 2nd ed. 1987, titled: A Guide to Simulation by Bratley, P., Fox, B. L., and Schrage, L. E.
В общем, некая неслучайность присутствует. И при решении некоторых задач это может быть неприятно.
И второй нюанс: если нам нужна выборка большого объема, то мы точно не будем работать в Excell. А значит и обращаться к его ГСЧ не сможем (технически это возможно, но скорость будет несоразмерна задаче). А вот какие ГСЧ используются сейчас в стандартных библиотеках, это вопрос. В моем случае (компиляторы Интел, 2008 год) плюсы и фортран к одному и тому же ГСЧ обращались. Как сейчас - не знаю (компилятор пока не могу обновить), но шанс столкнуться с подобным багом вполне реален. На что собственно и намекает довольно свежая хабровская статья уважаемого @red-cat-fat, которую я упомянул в первом комменте