|
Текст подпрограммы и версий gsr2r_c.zip |
Тексты тестовых примеров tgsr2r_c.zip |
Генерация массива псевдослучайных чисел, имеющих произвольное заданное распределение.
По таблично заданной желаeмoй функции распределения F (x) строится интерполяционный многочлен p (x) для функции F - 1 (x) - обратной по отношению к F (x).
Псевдослучайные величины с функцией распределения F (x) получаются по формуле R = p (u), где u - псевдослучайная величина, pавномеpно распределенная в интервале (0, 1).
Akima H., "A new method of interpolation and smooth curve fitting based on local procedures", JACM, 17(4), 1970, 589 - 602.
Guerra V.M., Tapia R.A., and Thomson J.R., "A random number generator for continuous random variables", ICSA Technical Report, Rice Univercity, Houston, Texas.
int gsr2r_c (integer *iseed, integer *n, real *r__, real *tbl,
integer *nx, integer *ip, integer *ierr)
Параметры
| iseed - | целая переменная, значение которой перед обращением к подпрограмме должно быть в пределах [1, 2147483646]; по окончании работы подпрограммы ей присваивается новое значение, котоpое может быть использовано при повторном вхождении в подпрограмму; |
| n - | заданное количество псевдослучайных чисел, которые необходимо сгенерировать (тип: целый); |
| r - | вещественный вектоp длины n содержащий полученные псевдослучайные величины; |
| t - | двумерный вещественный массив размерностью nx * 5, содержащий табличные значения функции распределения F: элементы t (1, 1), t (2, 1), ..., t (nx, 1) содержат абсциссы, элементы t (1, 2), ..., t (nx,2) - ординаты ( т.е. F (t (i, 1)) = t (i, 2) ). Должны выполняться следующие условия: t (i, 1) < t (i + 1, 1), t (i, 2) < t (i + 1, 2) для i = 1, 2, ...,nx - 1; t (1, 2) = 0.; t (nx, 2) = 1.; остальные элементы массива используются для хранения промежуточных результатов; |
| nx - | заданное количество узлов сетки, на которой задана функция распределения, nx ≥ 4 (тип: целый); |
| ip - | задает режим работы подпрограмы (тип: целый); при этом если: |
| ip= 0 - | то считается, что происходит первое обращение к подпрограмме и вычисляются коэффициенты интерполяционных полиномов; |
| ip= 1 - | то коэффициенты интерполяционных полиномов считаются уже вычисленными; |
| по окончании работы подпрограммы параметру ip присваивается значение единица; | |
| ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
| ierr=65 - | когда заданное количество узлов сетки, на которой задана функция распределения, меньше четырех; |
| ierr=66 - | когда либо абсциссы, либо ординаты табличных значений функции распределения не являются строго монотонно возрастающими; |
| ierr=67 - | когда t (1, 2) > 0, либо t (nx, 2) < 1. |
Версии: нет
Вызываемые подпрограммы
| gsu1r_c - | генерация массива псевдослучайных чисел, pавномеpно распределенных в интервале (0, 1); |
| i is9r_c - | интерполяция кубическим квази - эрмитовым сплайном табличной функции от одной переменной на неравномерной сетке; |
| utgs10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы gsr2r_c. |
| uti i10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы i is9r_с. |
Замечания по использованию
| Если после обращения к gsr2r_c с одной функцией распределения необходимо обратиться к gsr2r_c с другой функцией распределения, то необходимо установить параметр ip = 0. |
int main(void)
{
/* Initialized data */
static float t[30] /* was [6][5] */ = { 0.f,.6f,2.f,4.2f,7.2f,11.f,0.f,
.2f,.4f,.6f,.8f,1.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,
0.f,0.f,0.f,0.f,0.f,0.f,0.f };
/* Local variables */
static int ierr;
extern int gsr2r_c(int *, int *, float *, float *, int *, int *, int *);
static int n;
static float r__[3];
static int iseed, ip, nx;
nx = 6;
n = 3;
ip = 0;
iseed = 12457;
gsr2r_c(&iseed, &n, r__, t, &nx, &ip, &ierr);
printf("\n %16.7e %16.7e %16.7e \n",r__[0],r__[1],r__[2]);
printf("\n %5i %5i \n",ip,ierr);
return 0;
} /* main */
Результаты:
ip = 1
r = ( 0.192542, 3.772356, 3.887485 )
ierr = 0