Скачать Реализация pазличных cлучайных величин на Паcкале

28.02.1995
Скачать файл (1,36 Кб)

Точный обратный метод Бокса-Маллера.

При этом генерируется пара нормированных (мат.ожидание=0, ст.отклонение=1) нормальных чисел из двух стандартных случайных чисел.

Procedure Normal (var Num1, Num2: Real);
Const
  PI = 3.14159;
Var
  R1, R2: Real;
Begin
  R1 := Random;
  R2 := Random;
  Num1 := -2 * LN (R1) * COS (2 * PI * R2);
  Num2 := -2 * LN (R1) * SIN (2 * PI * R2);
End;

Метод Марсальи-Брея.

Более быстрый за счет исключения вычислений синусов и косинусов.

Procedure Normal (var Num1, Num2: Real);
Var
  R1, R2: Real;
  S: Real;
Begin
  Repeat
    R1 := 2 * Random - 1;
    R2 := 2 * Random - 1;
    S := SQR (R1) + SQR (R2);
  Until (S < 1);
  S := SQRT ((-2 * LN (S)) / S);
  Num1 := R1 * S;
  Num2 := R2 * S;
End;

Стандартный метод.

Основан на центральной предельной теореме. Требует много времени на генерацию 12-ти случайных чисел. Hедостатком также является плохое соответствие теории за пределами мат.ож. = 2 * стд.откл.

Procedure Normal (var Num: Real);
Var
  S: Real;
  i: 1..12;
Begin
  S := 0;
  For i := 1 To 12 Do
    S := S + Random;
  Num := S - 6;
End;

Метод Тичроу.

По сути дела это просто модифицированный 3), однако точность метода повышается до мат.ож. = 3 * стд.откл.

Procedure Normal (var Num: Real);
Const
  C1 = 0.029899776;
  C2 = 0.008355968;
  C3 = 0.076542912;
  C4 = 0.252408784;
  C5 = 3.949846138;
Var
  S: Real;
  i: 1..12;
Begin
  S := 0;
  For i := 1 To 12 Do
    S := S + Random;
  S := SQR ((S - 6) / 4);
  Num := ((((C1 * S + C2) * S + C3) * S + C4) * S + C5) * S;
End;

P.S. В заключение хочу сказать, что если ты получил нормализованное нормальное число, то получить нормальное число с заданными характеристиками не представляет никакого труда: предположим, что M - требуемое мат. ожидание, STD - требуемое стандартное отклонение, а NN - нормализованное нормальное число. Тогда требуемое нормальное число N найдется по формуле:
N := M + NN * STD.