Текст подпрограммы и версий
gsi1r_p.zip
Тексты тестовых примеров
tgsi1r_p.zip

Подпрограмма:  GSI1R (модуль GSI1R_p)

Назначение

Генерация одного псевдослучайного числа, имеющего биномиальное распределение.

Математическое описание

Генерируется псевдослучайное число 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