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

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

Назначение

Генерация координат псевдослучайных точек, pавномеpно распределенных на поверхности трехмерной и четырехмерной единичной сферы.

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

1.  Случай трехмерной сферы.

Пусть U1 и U2 - две независимые псевдослучайные величины, равномерно распределенные в интервале (-1, 1) и такие, что

      S  =  U12 + U22  ≤  1.

 Tогда искомые координаты определяются формулами:
        Z1  =  2 U1 √(1 - S) ,
        Z2  =  2 U2 √(1 - S) ,
        Z3  =  1 - 2 S . 
2.  Случай четырехмерной сферы.

Пусть U1, U2, U3, U4 - независимые псевдослучайные величины, равномерно распределенные в интервале ( - 1, 1 ) и

   U12 + U22 = S1  ≤ 1 ,
   U32 + U42 = S2  ≤ 1 . 

Тогда искомые координаты равны:

   Z1 = U1 ,    Z2 = U2 ,    Z3 = U3 [(1-S1) / S2]1/2 ,
   Z4 = U4 [(1-S1) / S2]1/2 . 

Marsaglia,G., "Choosing a point from the surface of a sphere", The Annals of Mathematical Statistics, 3(2), 1972, 645 - 646.

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

    int gsr1r_c (integer *iseed, integer *n, integer *iopt,
            real *z__)

Параметры

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

Версии: нет

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

gsu1r_c - генерация массива псевдослучайных чисел, pавномеpно распределенных в интервале (0, 1).

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

  Элемент массива z (i, k) содержит k - ую координату i - ой точки.

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

int main(void)
{
    /* Local variables */
    static int iopt;
    extern int gsr1r_c(int *, int *, int *, float *);
    static int n, iseed, i;
    static float z__[6]  /* was [2][3] */;

    iopt = 3;
    n = 2;
    iseed = 123456;
    gsr1r_c(&iseed, &n, &iopt, z__);

    printf("\n  %5i \n",iseed);
    for (i = 1; i <= 6; ++i) {
        printf("\n %16.7e \n",z__[i-1]);
    }
    return 0;
} /* main */


Результаты:

       z(1, 1)  =  -0.4960526344526;        z(2, 1)  =  -0.9250978409600;
       z(1, 2)  =   0.8586316551782;        z(2, 2)  =  -0.1760423796943;
       z(1, 3)  =  -0.1291644865232;        z(2, 3)  =   0.3364566319801.