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

Подпрограмма:  GSR1R (модуль GSR1R_p)

Назначение

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