Текст подпрограммы и версий
gsp1r_c.zip , gsp2r_c.zip
Тексты тестовых примеров
tgsp1r_c.zip , tgsp2r_c.zip

Подпрограмма:  gsp1r_c (версия gsp2r_c)

Назначение

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

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

Величина 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_c) состоит в том, что 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.

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

    int gsp1r_c (real *rlam, integer *iseed, integer *n,
            integer *k, integer *ierr)

Параметры

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

Версии

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

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

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

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

  Подпрограмма gsp2r_c работает быстрее чем gsp1r_c в тех случаях, когда генерируется большое количество псевдослучайных чисел с неизменным rlam, т.е. когда, либо велико n при однократном вызове gsp2r_c, либо когда происходят частые обращения к gsp2r_c с одинаковым rlam.

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

int main(void)
{
    /* Local variables */
    static float rlam;
    static int ierr;
    extern int gsp1r_c(float *, int *, int *, int *, int *);
    static int k[5], n, iseed;

    iseed = 123456;
    n = 5;
    rlam = .5f;
    gsp1r_c(&rlam, &iseed, &n, k, &ierr);

    printf("\n  %5i %5i %5i %5i %5i \n",k[0],k[1],k[2],k[3],k[4]);
    printf("\n  %5i \n",ierr);
    return 0;
} /* main */


Результат:  

       k  =  ( 1, 0, 0, 0, 3 ) ;   ierr = 0