Текст подпрограммы и версий
gsi1r_c.zip
Тексты тестовых примеров
tgsi1r_c.zip

Подпрограмма:  gsi1r_c

Назначение

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

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

Генерируется псевдослучайнoe чиcло R такое, что

     P{R=K}  =  CNK  pK (1 - p) (N-K) ,     K = 0, 1, ..., N ,    0 ≤ p ≤ 1 , 

где N и p - параметры биномиального распределения.

Если N < 15, то число R получается как сумма N независимых псевдослучайных чисел, принимающих значения 1 и 0 с вероятностями  p и (1 - p) соответственно.

Для N ≥ 15 используется нормальная аппроксимация биномиального распределения.

A.D.Relles, A simple algorithm for generating binomial random variables when N is large, Journal of the American Statistical Association, 339(67), 1972, 612-613.

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

    real gsi1r_c (integer *iseed, integer *n, real *p)

Параметры

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

Версии : нет

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

gsu2r_c - генерация одного псевдослучайного числа, pавномеpно распределенного в интервале (0, 1) ;
gsn2r_c - генерация одного псевдослучайного числа, ноpмально распределенного с нулевым средним значением и единичной дисперсией;
sf35r_c - вычисление значений дополнительной функции ошибок (дополнительного интеграла вероятностей).

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

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

int main(void)
{
    /* Local variables */
    extern float gsi1r_c(int *, int *, float *);
    static int i__, j, n;
    static float p, x[10];
    static int iseed;

    iseed = 123456;
    n = 2;
        printf("\n   gsi1r \n \n  n = 2 \n");
    for (j = 1; j <= 3; ++j) {
        p = .01f;
        for (i__ = 1; i__ <= 3; ++i__) {
            x[i__ - 1] = (float)gsi1r_c(&iseed, &n, &p);
            if (p <= .01f) {
                goto l2;
            }
            p = .7f;
            goto l1;
l2:
            p = .1f;
l1:     ;
        }
    printf("\n p=0.01   x[0]= %16.7e \n p=0.1   x[1]= %16.7e \n", x[0],x[1]);
    printf(" p=0.7   x[2]= %16.7e \n",x[2]);
        if (n <= 2) { goto l3;}
        n = 30;
        printf("\n n = 30 \n");
        goto l4;
l3:
        n = 10;
        printf("\n n = 10 \n");
l4:     ;
    }
    return 0;
} /* main */


Результаты:    r = 0.0