Текст подпрограммы и версий
gsu1r_p.zip , gsu2r_p.zip
Тексты тестовых примеров
tgsu1r_p.zip , tgsu2r_p.zip

Подпрограмма:  GSU1R (модуль GSU1R_p) (версия GSU2R)

Назначение

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

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

Псевдослучайные числа R (J) получаются по следующим рекуррентным формулам:

     K0  =  ISEED ,    где  ISEED - некотоpое целое начальное значение
                                                      из отрезка  [1, 2147483646] .
     KJ  =  7 5 * KJ-1  ( mod 231 - 1 ) ,    1 ≤ J ≤ N

     R(J)  =  KJ * 2-31 ,   1 ≤ J ≤ N
     ISEED  =  KN 

Д.Кнут, Искусство программирования для ЭВМ, т. 2, "Мир", M., 1977, стp. 22 - 51.

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

procedure GSU1R(var ISEED :Integer; N :Integer; var R :Array of Real); 

Параметры

ISEED - целая переменная, значение которой перед обращением к подпрограмме может быть любым целым числом в пределах [1, 2147483646]; по окончании работы ее значение полагается равным (231) * R (N), и это значение может быть использовано при последующем вхождении в подпрограмму;
N - заданное количество генерируемых псевдослучайных чисел (тип: целый);
R - вещественный массив длины N, содержащий вычисленные псевдослучайные числа.

Версии

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

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

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

  GSU2R является подпрограммой функцией и имеет заголовок
 
function GSU2R(var ISEED :Integer): Real;

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

Unit TGSU1R_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc, UtRes_p, GSU1R_p;

function TGSU1R: String; 

implementation

function TGSU1R: String;
var
ISEED,N,_i :Integer;
R :Array [0..2] of Real;
begin
Result := '';
ISЕЕЕ := 123457;
N := 3;
GSU1R(ISEED,N,R);
Result := Result + Format('%s',[' PEЗУЛЬTAT' + #$0D#$0A + ' ']);
Result := Result + Format('%25d',[ISEED]) + #$0D#$0A;
Result := Result + Format('%s',[' R=']);
Result := Result + #$0D#$0A;
for _i:=0 to 2 do
 begin
  Result := Result + Format('%20.16f ',[R[_i]]);
  if ( ((_i+1) mod 3)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('TGSU1R',Result);  { вывод результатов в файл TGSU1R.res }
exit;
end;

end.

Результат:

       ISEED  =  1645535613
       R(1)   =  0.966220069211
       R(2)   =  0.260710790753
       R(3)   =  0.766262231860