Текст подпрограммы и версий
gsg1r_c.zip  gsg2r_c.zip  gsg3r_c.zip
Тексты тестовых примеров
tgsg1r_c.zip  tgsg2r_c.zip  tgsg3r_c.zip

Подпрограмма:  gsg1r_c (версии: gsg2r_c,gsg3r)

Назначение

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

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

Получающиеся в результате работы подпрограммы псевдослучайные числа имеют плотность распределения

     f(x) = (Г(A)*BA)-1 * x(A-1) * exp(-x/B)
     x>0 ,  A>0 ,  B>0.  

Алгоритм основан на приближенном вычислении инвертированной функции гамма - распределения.

1. Johnk,M.D., Erzung von betaverteiler und gammaverteiler zufallzahlen, Metrica, 8 (2), 1964.
2.

Phillips, Don T., and Beightler, Charles S., Procedures for generating gamma variates with non - integer parameter sets, Journal of Statistical Computation and Simulation, 1, 1972, 197 - 208.

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

    int gsg1r_c (integer *iseed, real *a, real *b, integer *n,
            real *r__)

Параметры

iseed - целая переменная, значение которой перед обращением к подпрограмме может быть любым целым числом в пределах [1,2147483646]; по окончании работы ей присваивается новое значение, котоpое может быть использовано при последующем вхождении в подпрограмму;
a - заданный параметр гамма - распределения (тип: вещественный);
b - заданный параметр гамма - распределения (тип: вещественный);
n - заданное количество генерируемых псевдослучайных чисел (тип: целый);
r - вещественный массив длины n, содержащий вычисленные псевдослучайные числа.

Версии

gsg2r_c - генерация массива псевдослучайных чисел, имеющих гамма - распределение;
gsg3r_c - генерация массива псевдослучайных чисел, имеющих гамма - распределение;

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

gsu1r_c - генерация массива псевдослучайных чисел, pавномеpно распределенных в интервале (0, 1);
gsb1r_c - генерация массива псевдослучайных чисел, имеющих бэта - распределение (используется только для версии gsg3r_c).

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

  Подпрограмма gsg2r_c использует значения некоторых коэффициентов, которые вычисляет подпрограмма gsg1r_c (они передаются через внешнюю структуру с именем gsg1r1_ ).
  Поэтому подпрограммой gsg2r_c можно пользоваться только после обращения к подпрограмме gsg1r_c с теми же параметрами гамма - распределения a и b.
  Подпрограмма gsg2r_c работает быстрее чем gsg1r_c; поэтому при необходимости получить несколько массивов псевдослучайных чисел с одинаковыми a и b следует первый раз обратиться к gsg1r_c, а потом обращаться к gsg2r_c.
 

Поскольку параметры a и b задаются при обращении к gsg1r_c, то подпрограмма gsg2r_c имеет заголовок

 

int gsg2r_c (integer *iseed, integer *n, real *r__)

 

Подпрограмма gsg3r_c работает быстрее в тех случаях, когда для заданных a и b требуется получить лишь небольшое количество псевдослучайных чисел (не более трех - пяти).

 

Подпрограмма gsg3r_c имеет заголовок

 

int gsg3r_c (integer *iseed, real *a, real *b, integer *n, real *w, real *r__)

  где w - вещественный массив длины не менее чем [a] + 1, используемый подпрограммой для хранения промежуточных pезультатов.

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

int main(void)
{
    /* Local variables */
    extern int gsg1r_c(int *, float *, float *, int *, float *);
    static float a, b;
    static int n;
    static float r__[3];
    static int iseed;

    iseed = 123456;
    a = .5f;
    n = 3;
    b = .8f;
    gsg1r_c(&iseed, &a, &b, &n, r__);

    printf("\n  %10i \n",iseed);
    printf("\n  %16.7e %16.7e %16.7e \n",r__[0],r__[1],r__[2]);
    return 0;
} /* main */


Результаты:

       r(1) = 0.3292359
       r(2) = 0.01474222
       r(3) = 0.1836272
       r(4) = 0.06199761
       r(5) = 0.6892484