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

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

Назначение

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

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

По таблично заданной жела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