|
Текст подпрограммы и версий gsr1r_p.zip |
Тексты тестовых примеров tgsr1r_p.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.
procedure GSR1R(var ISEED :Integer; N :Integer; IOPT :Integer;
var Z :Array of Real);
Параметры
| ISEED - | целая переменная, значение которой перед обращением к подпрограмме может быть любым целым числом в пределах [1, 2147483646]; по окончании работы ей присваивается новое значение, котоpое может быть использовано при последующем вхождении в подпрограмму; |
| N - | заданное количество генерируемых псевдослучайных точек (тип: целый); |
| IOPT - | определяет размерность сферы: IOPT = 3 для генерации случайных точек на поверхности тpехмеpной сферы и IOPT = 4 - для четырехмерной сферы (тип: целый); |
| Z - | вещественный массив размерности N на IOPT, содержащий вычисленные координаты псевдослучайных точек. |
Версии: нет
Вызываемые подпрограммы
| GSU1R - | генерация массива псевдослучайных чисел, pавномеpно распределенных в интервале (0, 1). |
Замечания по использованию
| Элемент массива Z (I, K) содержит К - ую координату I - ой точки. |
Unit TGSR1R_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc, UtRes_p, GSR1R_p;
function TGSR1R: String;
implementation
function TGSR1R: String;
var
IOPT,N,ISEED,_i :Integer;
Z :Array [0..5] of Real;
begin
Result := '';
IОРТ := 3;
N := 2;
ISEED := 123456;
GSR1R(ISEED,N,IOPT,Z);
Result := Result + Format(' %10d',[ISEED]) + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 5 do
begin
Result := Result + Format('%20.16f ',[Z[_i]]);
if ( ((_i+1) mod 3)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
UtRes('TGSR1R',Result); { вывод результатов в файл TGSR1R.res }
exit;
end;
end.
Результаты:
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.