Текст подпрограммы и версий gsi1r_p.zip |
Тексты тестовых примеров tgsi1r_p.zip |
Генерация одного псевдослучайного числа, имеющего биномиальное распределение.
Генерируется псевдослучайное число R такое, что
P{R=K} = CNK pK (1 - p) (N-K) , K = 0, 1, ..., N , 0 ≤ p ≤ 1 ,
где N и p - параметры биномиального распределения.
Если N < 15, то число R получается как сумма N независимых псевдослучайных чисел, принимающих значения 1 и 0 с вероятностями p и (1 - p) соответственно.
Для N ≥ 15 используется нормальная аппроксимация биномиального распределения.
A.D.Relles, A simple algorithm for generating binomial random variables when N is large, Journal of the American Statistical Association, 339(67), 1972, 612-613.
function GSI1R(ISEED :Integer; N :Integer; P :Real): Real;
Параметры
ISEED - | целая переменная, значение которой перед обращением к подпрограмме может быть любым целым числом в пределах [1,2147483646]; по окончании работы ей присваивается новое значение, котоpое может быть использовано при последующем вхождении в подпрограмму; |
N - | параметр биномиального распределения (N ≥ 0) (тип: целый); |
P - | параметр биномиального распределения (0 ≤ P ≤ 1) (тип: вещественный). |
Версии : нет
Вызываемые подпрограммы
GSU2R - | генерация одного псевдослучайного числа, pавномеpно распределенного в интервале (0, 1) ; |
GSN2R - | генерация одного псевдослучайного числа, ноpмально распределенного с нулевым средним значением и единичной дисперсией; |
SF35R - | вычисление значений дополнительной функции ошибок (дополнительного интеграла вероятностей). |
Замечания по использованию : нет
Unit TGSI1R_p; interface uses SysUtils, Math, { Delphi } LStruct, Lfunc, UtRes_p, GSI1R_p; function TGSI1R: String; implementation function TGSI1R: String; var ISEED,N,J,I :Integer; P :Real; X :Array [0..9] of Real; label _2,_1,_3,_4; begin Result := ''; ISEED := 123456; N := 2; Result := Result + Format('%s',[' GSI1R' + #$0D#$0A]) + #$0D#$0A; Result := Result + Format('%s',[' N=2']) + #$0D#$0A; for J:=1 to 3 do begin P := 0.01; for I:=1 to 3 do begin X[I-1] := GSI1R(ISEED,N,P); if ( P <= 0.01 ) then goto _2; P := 0.7; goto _1; _2: P := 0.1; _1: end; Result := Result + Format('%s',[' P=0.01'+#$0D#$0A+ ' P=0.1'+#$0D#$0A+ ' P=0.7' + #$0D#$0A]) + #$0D#$0A; Result := Result + #$0D#$0A; for I:=1 to 3 do begin Result := Result + Format('%20.16f ',[X[I-1]]) + #$0D#$0A; end; Result := Result + #$0D#$0A; if ( N <= 2 ) then goto _3; N := 30; Result := Result + Format('%s',[' N=30']) + #$0D#$0A; goto _4; _3: N := 10; Result := Result + Format('%s',[' N=10']) + #$0D#$0A; _4: end; UtRes('TGSI1R',Result); { вывод результатов в файл TGSI1R.res } exit; end; end. Результаты: R = 0.0