Текст подпрограммы и версий gsp1r_p.zip , gsp2r_p.zip |
Тексты тестовых примеров tgsp1r_p.zip , tgsp2r_p.zip |
Генерация массива псевдослучайных чисел, распределенных по закону Пуассона.
Величина 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