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