Текст подпрограммы и версий gsg1r_p.zip gsg2r_p.zip gsg3r_p.zip |
Тексты тестовых примеров tgsg1r_p.zip tgsg2r_p.zip tgsg3r_p.zip |
Генерация массива псевдослучайных чисел, имеющих гамма - распределение.
Получающиеся в результате работы подпрограммы псевдослучайные числа имеют плотность распределения
f(x) = (Г(A)*BA)-1 * x(A-1) * exp(-x/B)
x>0 , A>0 , B>0.
Алгоритм основан на приближенном вычислении инвертированной функции гамма - распределения.
1. | Johnk,M.D., Erzung von betaverteiler und gammaverteiler zufallzahlen, Metrica, 8 (2), 1964. |
2. |
Phillips, Don T., and Beightler, Charles S., Procedures for generating gamma variates with non - integer parameter sets, Journal of Statistical Computation and Simulation, 1, 1972, 197 - 208. |
procedure GSG1R(var ISEED :Integer; A :Real; B :Real; var N :Integer; var R :Array of Real);
Параметры
ISEED - | целая переменная, значение которой перед обращением к подпрограмме может быть любым целым числом в пределах [1,2147483646]; по окончании работы ей присваивается новое значение, котоpое может быть использовано при последующем вхождении в подпрограмму; |
A - | заданный параметр гамма - распределения (тип: вещественный); |
B - | заданный параметр гамма - распределения (тип: вещественный); |
N - | заданное количество генерируемых псевдослучайных чисел (тип: целый); |
R - | вещественный массив длины N, содержащий вычисленные псевдослучайные числа. |
Версии
GSG2R - | генерация массива псевдослучайных чисел, имеющих гамма - распределение; |
GSG3R - | генерация массива псевдослучайных чисел, имеющих гамма - распределение; |
Вызываемые подпрограммы
GSU1R - | генерация массива псевдослучайных чисел, pавномеpно распределенных в интервале (0, 1); |
GSB1R - | генерация массива псевдослучайных чисел, имеющих бэта - распределение (используется только для версии GSG3R). |
Замечания по использованию
Подпрограмма GSG2R использует значения некоторых коэффициентов, которые вычисляет подпрограмма GSG1R (они передаются через глобальную запись (структуру данных) _GSG1R1). | |
Поэтому подпрограммой GSG2R можно пользоваться только после обращения к подпрограмме GSG1R с теми же параметрами гамма - распределения A и B. | |
Подпрограмма GSG2R работает быстрее чем GSG1R; поэтому при необходимости получить несколько массивов псевдослучайных чисел с одинаковыми A и B следует первый раз обратиться к GSG1R, а потом обращаться к GSG2R. | |
Поскольку параметры A и B задаются при обращении к GSG1R, то подпрограмма GSG2R имеет заголовок | |
procedure GSG2R(var ISEED :Integer; var N :Integer; var R :Array of Real); | |
Подпрограмма GSG3R работает быстрее в тех случаях, когда для заданных A и B требуется получить лишь небольшое количество псевдослучайных чисел (не более трех - пяти). | |
Подпрограмма GSG3R имеет заголовок | |
procedure GSG3R(var ISEED :Integer; A :Real; B :Real; var N :Integer; var W :Array of Real; var R :Array of Real); | |
где W - вещественный массив длины не менее чем [A] + 1, используемый подпрограммой для хранения промежуточных pезультатов. |
Unit TGSG1R_p; interface uses SysUtils, Math, { Delphi } LStruct, Lfunc, UtRes_p, GSG1R_p; function TGSG1R: String; implementation function TGSG1R: String; var ISEED,N,_i :Integer; A,B :Real; R :Array [0..2] of Real; begin RЕSULt := ''; ISEED := 123456; A := 0.5; N := 3; B := 0.8; Result := Result + Format('%10d',[ISEED]) + #$0D#$0A; GSG1R(ISEED,A,B,N,R); Result := Result + #$0D#$0A; for _i:=0 to 2 do begin Result := Result + Format('%20.16f ',[R[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + Format('%10d',[ISEED]) + #$0D#$0A; UtRes('TGSG1R',Result); { вывод результатов в файл TGSG1R.res } exit; end; end. Результаты: R(1) = 0.3292359 R(2) = 0.01474222 R(3) = 0.1836272 R(4) = 0.06199761 R(5) = 0.6892484