|
Текст подпрограммы и версий gsi1r_c.zip |
Тексты тестовых примеров tgsi1r_c.zip |
Генерация одного псевдослучайного числа, имеющего биномиальное распределение.
Генерируется псевдослучайн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