Б. Горбунов Получение случайных чисел с нормальным распределением Аннотация: В статье описывается функция на языке Turbo Pascal, генерирующая случайные числа со стандартным нормальным распределением, имеющим нулевое среднее значение и единичную дисперсию. Те, кому необходимо иметь качественный генератор случайных чисел с нормальным распределением, наверняка сталкиваются с трудностями поиска подходящего алгоритма. Автору пришлось пересмотреть большое количество специальной литературы, прежде чем он нашел такой алгоритм в [1]. На базе него на языке Turbo Pascal была написана функция, выдающая случайные числа со стандартным нормальным распределением, имеющим нулевое среднее значение и единичную дисперсию (пример). Для образования пары независимых случайных чисел с нормальным распределением используется пара случайных чисел с равномерным распределением в интервале от 0 до 1. Поскольку используемый метод образует сразу два числа, то функция имеет "двухтактный" режим работы: при первом обращении к ней образуется пара чисел и одно из них передается в качестве значения функции, а при втором обращении осуществляется только передача второго числа. При начальном обращении к функции из программы предусмотрена инициализация генератора случайных чисел. Последовательность чисел, получаемая с помощью функции, является псевдослучайной, т.е. имеет некий период повторения. При попытке определить этот период экспериментально было установлено, что он превышает по крайней мере 100 млн. значений. ЛИТЕРАТУРА 1. Справочник по специальным функциям с формулами, графиками и математическими таблицами. Под ред. М.Абрамовица и И.Стиган.: Пер.с англ.под ред.В.А.Диткина и Л.Н.Кармазиной. М.: Наука, Гл.ред.физ.-мат.лит., 1979, с.746. {Пример. Функция - генератор случайных чисел } {со стандартным нормальным распределением } function NormRandom : double; const Ready : boolean = false; SecondValue : double = 0.0; Start : boolean = true; var Argument : double; Factor : double; begin if (Start = true) then begin Start := false; Randomize; end; if (Ready = false) then begin Ready := true; Factor := Sqrt(-2.0 * Ln(Random)); Argument := 2.0 * Pi * Random; SecondValue := Factor * Sin(Argument); NormRandom := Factor * Cos(Argument); end else begin Ready := false; NormRandom := SecondValue; end; end; { function NormRandom }