Один простой метод, который улучшает свойства случайных пос-
ледовательностей, порождаемых тремя генераторами, заключается в
комбинировании их под управлением одной главной функции. Данная
функция выбирает между двумя из них, основываясь на результате
третьей. С помощью этого метода вы можете получить очень длинный
период и уменьшить влияние циклов и смещений. Функция, называемая
CombRandom, показанная здесь, осуществляет комбинирование выводов
генераторов Ran1, Ran2, Random:
{данная функция использует три генератора для возврата одного
случайного числа
}
function CombRandom: real;
var
f: real;
begin
f := Ran2;
if f>0.5 thenCombRandom := Random
else CombRandom := Ran1; { случайный выбор генератора }
end; {CombRandom}
Результат Ran2 используется для того, чтобы решить, Ran1 или
Random выдаст значение главной функции CombRandom. При таком ме-
тоде период главной функции равен или больше суммы периодов
Random и Ran1. Таким образом, данный метод делает возможным по-
рождение последовательности с очень длинным периодом. Можно легко
изменять смесь Random и Ran1 изменением константы в операторе if,
чтобы получить желаемое вами распределение между этими двумя ге-
нераторами. Кроме того, вы можете добавить дополнительные генера-
торы и осуществлять выбор между ними для получения еще более
длинного периода.
Далее следует программа для отображения диаграммы CompRandom
и ее среднего значения. На рис.7-3 показана финальная диаграмма
после генерации 1000 чисел. Среднее значение CombRandom равно
0,493361.
{ данная программа демонстрирует комбинированный вывод трех
генераторов случайных чисел
}
program MultiRandom;
uses
Graph;
const
COUNT=1000;
var
freg: array[0..9] of integer;
a2,a1: integer;
f, r: real;
y, x: integer;
GraphDriver, GraphMode: integer;
{ отображение графического
представления работы генераторов }
procedure Display;
var
t: integer;
begin
for t := 0 to 9 do
Line(t*10+110, 180, t*10+110, 180-freg[t]);
end; {Display}
function Ran1: real;
var
t: real;
begin
t := (a1*32749+3) mod 32749;
a1 := Trunc(t);
Ran1 := Abs(t/32749);
end; {Ran1}
function Ran2: real;
var
t: real;
begin
t := (a2*10001+3) mod 17417;
a2 := Trunc(t);
Ran2 := Abs(t/17417);
end; {Ran2}
{данная функция использует три генератора
для возврата одного случайного числа
}
function CombRandom real;
var
t: real;
begin
f := Ran2;
if f>0.5 then CombRandom := Random
else CombRandom := Ran1; {случайный выбор генератора }
end; {CombRandom}
begin
{ переключение на
графический режим, используя режим 4 CGA/EGA }
GraphDriver := CGA;
GraphMode := CGAC1;
InitGraph(GraphDriver, GraphMode, '');
SetColor(2);
SetLineStyle(SolidLn, 0, NormWidth);
OutTextXy(48, 10, 'вывод, полученный комбинированием ');
OutTextXy(40,20, 'три генератора случайных чисел ');
Line(110, 180, 200, 180);
a1:=1; a2:=203; {инициализация переменных для
генераторов случайных чисел }
f := 0;
for x:=0 to 9 do freg[x]:=0; {инициализация матрицы
частот}
for x := 1 to COUNT do begin
r:=CombRandom; { взять случайное число }
f:=f+1; { прибавить для вычисления среднего }
y:=Trunc(r*10);{ преобразовать в целое число от 0 до 9}
freg[y]:=freg[y]+1;{ увеличить счетчик частоты }
Display;
end;
ReadLn;
RestoreCrtMode;
WriteLn('Среднее случайное число равно : ', f/COUNT);
end.
-----------------------------------------------------
Вывод, полученный комбинированием трех генераторов случай-
ных чисел.
¦ ¦
¦ ¦ ¦ ¦
¦¦¦¦¦¦¦¦¦¦
¦¦¦¦¦¦¦¦¦¦
¦¦¦¦¦¦¦¦¦¦
¦¦¦¦¦¦¦¦¦¦
¦¦¦¦¦¦¦¦¦¦
+--------+
------------------------------------------------------