Текст подпрограммы и версий gsg1r_c.zip gsg2r_c.zip gsg3r_c.zip |
Тексты тестовых примеров tgsg1r_c.zip tgsg2r_c.zip tgsg3r_c.zip |
Генерация массива псевдослучайных чисел, имеющих гамма - распределение.
Получающиеся в результате работы подпрограммы псевдослучайные числа имеют плотность распределения
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