Текст подпрограммы и версий
gsp1r_p.zip , gsp2r_p.zip
Тексты тестовых примеров
tgsp1r_p.zip , tgsp2r_p.zip

Подпрограмма:  GSP1R (модуль GSP1R_p) (версия GSP2R)

Назначение

Генерация массива псевдослучайных чисел, распределенных по закону Пуассона.

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

Величина K будет распределена по закону Пуассона с параметром RLAM

     P{ K= m }  =  exp (-RLAM) * RLAMm / m !

 если
     exp (-RLAM)  ≥  U1 U2 ... UK UK+1  ≥  exp (-RLAM) * UK+1 , 

где U1, U2,...,UK, UK+1 - независимые случайные величины, равномерно распределенные в интервале (0,1).

Другой способ генерации (реализованный в версии GSP2R) состоит в том, что K выбирается из неpавенства

  K
  ∑   exp (-RLAM) RLAM i / i !  ≤  U  <
  i=0
                                                       K+1
                                                   <   ∑   exp (-RLAM) RLAM i / i !
                                                        i=0 

где U - случайная величина, pавномеpно распределенная в интервале (0, 1).

Schaffer, Henry E., "Algorithm 369, generator of random numbers satisfying the Poisson distribution", Comm. ACM, 13(1), 1970, 49.

Snow, Richard H., "Algorithm 342, generator of random numbers satisfying the Poisson distribution", Comm. ACM, 11(12), 1968, 819.

Использование

procedure GSP1R(RLAM :Real; var ISEED :Integer; N :Integer;
                var K :Array of Integer; var IERR :Integer);

Параметры

RLAM - заданный параметр распределения Пуассона, значение которого должно лежать в интервале (0, 40) (тип: вещественный);
ISEED - целая переменная, значение которой перед обращением к подпрограмме может быть любым целым числом в пределах [1, 2147483646]; по окончании работы ей присваивается новое значение, котоpое может быть использовано при последующем вхождении в подпрограмму;
N - заданное количество генерируемых псевдослучайных чисел (тип: целый);
K - целый массив длины N, содержащий полученные псевдослучайные числа;
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
IERR=65 - когда значение RLAM меньше 0 или больше 40.

Версии

GSP2R - генерация массива псевдослучайных чисел, pаспределенных по закону Пуассона.

Вызываемые подпрограммы

GSU1R - генерация массива псевдослучайных чисел, pавномеpно распределенных в интервале (0, 1);
UTGS10 - подпрограмма выдачи диагностических сообщений при работе подпрограмм GSP1R и GSP2R.

Замечания по использованию

  Подпрограмма GSP2R работает быстрее чем GSP1R в тех случаях, когда генерируется большое количество псевдослучайных чисел с неизменным RLAM, т.е. когда, либо велико N при однократном вызове GSP2R, либо когда происходят частые обращения к GSP2R с одинаковым RLAM.

Пример использования

Unit TGSP1R_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc, UtRes_p, GSP1R_p;

function TGSP1R: String; 

implementation

function TGSP1R: String;
var
ISEED,N,_i,IERR :Integer;
RLАМ :Real;
K :Array [0..4] of Integer;
begin
Result := '';
ISEED := 123456;
N := 5;
RLАМ := 0.5;
GSP1R(RLAM,ISEED,N,K,IERR);
Result := Result + #$0D#$0A;
for _i:=0 to 4 do
 begin
  Result := Result + Format('%10d',[K[_i]]);
  if ( ((_i+1) mod 1)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%5d',[IERR]) + #$0D#$0A;
UtRes('TGSP1R',Result);  { вывод результатов в файл TGSP1R.res }
exit;
end;

end.

Результат:  

       K  =  ( 1, 0, 0, 0, 3 ) ;   IERR = 0