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