Федеральное агентство по образованию
Московский Государственный Текстильный Университет
им. А.Н.Косыгина
Лабораторная работа №1
по теме:
«Генерация последовательностей псевдослучайных
чисел (ПСЧ)»
Выполнила:
студентка группы 42-08
Нонина Д.Е
Проверила:
Зензинова Ю.Б.
Москва 2011
Цель работы.
Исследование конгруэнтного мультипликативного алгоритма генерации ППСЧ
Исследование статистических свойств ППСЧ
Задание.
1). Написать программу генерации ППСЧ заданной длины ( ) с использованием мультипликативного алгоритма. Выбрать так, чтобы .
2). Построить графики функции в координатах при трёх заданных значениях параметров и .
3). Выполнить генерацию значений ПСЧ для первого варианта значений параметров и , и трёх заданных стартовых чисел . Построить аналогичные графики трёх последовательностей.
4). Разработать алгоритм, нарисовать блок-схему, написать и отладить программу определения отрезка апериодичности и периода ППСЧ.
Часть 2
Выполнить проверку сгенерированной ППСЧ на соответствие равномерному закону распределения с заданными параметрами и однородность распределения последовательности при разбиении ППСЧ на M подпоследовательностей. Использовать критерии Колмогорова и хи–квадрат. Написать программы для вычисления расчетных значений этих критериев.
Выполнить проверку сгенерированной ППСЧ на соответствие гипотезе об отсутствии тренда среднего, используя критерий серий (четные номера вариантов) и критерий «восходящих» и «нисходящих» серий (нечетные номера вариантов).
Выполнить проверку гипотезы об однородности дисперсии сгенерированной ППСЧ. Для этого вычислить точечные оценки дисперсии для всех подпоследовательностей ППСЧ и сравнить их с гипотетической дисперсией равномерного закона распределения по критерию хи-квадрат.
Вариант №10
Исходные данные.
A |
b |
X(0) |
K |
T |
N |
M |
||||||
5,2 |
10 |
13 |
0 |
2,2 |
7,8 |
0 |
.11 |
.4 |
5 |
60 |
14000 |
70 |
Ход работы.
1. Программа генерирует заданное количество чисел по конгруэнтно мультипликативному алгоритму в пределах от 0 до k. Их количество равно N. A и B соответствуют второму варианту.
Так же программа может выводить последовательность псевдослучайных чисел с любыми параметрами. Ограничения действуют лишь на параметры k (9999) – длина отрезка, внутри которого генерируются числа, и N (10000) – количество генерируемых чисел ППСЧ.
Ниже вывода ППСЧ на экране также отображаются максимальное и минимальное число из этой последовательности.
2. Программа строит графики функции при трёх заданных значениях параметров А и В, и для начального параметра по второму варианту.
3. Программа выполняет генерацию T ПСЧ для А и В по второму варианту и трёх начальных условиях. Также программа выводит на экран графики этих ППСЧ.
4. Программа находит период ППСЧ и отрезок апериодичности ППСЧ для второго варианта параметров А, В, Xo.
Текст программы.
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, AppEvnts, ComCtrls, jpeg, TeeProcs,
TeEngine, Chart;
type
TfmMain = class(TForm)
ListBox1: TListBox;
Button1: TButton;
Panel1: TPanel;
Bevel1: TBevel;
Label1: TLabel;
LabeledEdit1: TLabeledEdit;
LabeledEdit2: TLabeledEdit;
LabeledEdit3: TLabeledEdit;
Bevel2: TBevel;
Bevel3: TBevel;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit1: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Bevel4: TBevel;
Bevel5: TBevel;
Bevel6: TBevel;
Bevel7: TBevel;
Bevel8: TBevel;
PageControl1: TPageControl;
StatusBar1: TStatusBar;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
TabSheet3: TTabSheet;
TabSheet4: TTabSheet;
ApplicationEvents1: TApplicationEvents;
Button2: TButton;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Image2: TImage;
Image3: TImage;
Image4: TImage;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
Label20: TLabel;
Label21: TLabel;
ListBox2: TListBox;
ListBox3: TListBox;
ListBox4: TListBox;
Image5: TImage;
Bevel12: TBevel;
Image6: TImage;
Image7: TImage;
Label22: TLabel;
Bevel15: TBevel;
Bevel13: TBevel;
Bevel14: TBevel;
Bevel9: TBevel;
Bevel10: TBevel;
Label23: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
procedure FormCreate(Sender: TObject);
procedure Clean;
procedure Edit9Change(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure Edit2Change(Sender: TObject);
procedure Edit3Change(Sender: TObject);
procedure Edit4Change(Sender: TObject);
procedure Edit5Change(Sender: TObject);
procedure Edit6Change(Sender: TObject);
procedure LabeledEdit1Change(Sender: TObject);
procedure LabeledEdit2Change(Sender: TObject);
procedure LabeledEdit3Change(Sender: TObject);
procedure Edit7Change(Sender: TObject);
procedure Edit8Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmMain: TfmMain;
implementation
{$R *.dfm}
procedure TfmMain.Button1Click(Sender: TObject);
var
i,j,N,T:integer;
x:array[0..100000] of real;
A,B,k,m,min,max,mem: real;
// xH:array[0..10000, 0..10000] of real;
begin
fmMain.ListBox1.Clear;
A:=StrToFloat(fmMain.LabeledEdit2.Text);
B:=StrToFloat(fmMain.Edit2.Text);
k:=StrToFloat(fmMain.Edit7.Text);
N:=StrToInt(fmMain.Edit9.Text);
x[0]:=StrToFloat(fmMain.Edit5.Text);
m:=k;
min:=x[0];
max:=x[0];
for i:=1 to N do begin
x[i]:=(A*x[i-1]+B);
while x[i]>m do
x[i]:=x[i]-m;
fmMain.ListBox1.Items.Add(FloatToStr(x[i]));
if x[i]>max then
max:=x[i];
if x[i]<min then
min:=x[i];
end;
fmMain.Label8.Caption:=FloatToStr(min)+';';
fmMain.Label10.Caption:=FloatToStr(max)+'.';
fmMain.Label6.Caption:=FloatToStr(k)+')';
fmMain.Label3.Caption:=IntToStr(N);
fmMain.Label11.Caption:='A = '+FloatToStr(A)+'; B = '+FloatToStr(B)+'; Xo = '+FloatToStr(x[0])+'.';
Clean;
x[0]:=StrToFloat(fmMain.Edit4.Text);
A:=StrToFloat(fmMain.LabeledEdit1.Text);
B:=StrToFloat(fmMain.Edit1.Text);
for i:=1 to N do begin
x[i]:=(A*x[i-1]+B);
while x[i]>m do
x[i]:=x[i]-m;
fmMain.Image2.Canvas.Pen.Color:=clBlack;
fmMain.Image2.Canvas.Ellipse(Trunc(x[i-1]*200/k+10), Trunc(240-x[i]*200/k), Trunc(x[i-1]*200/k+10+1), Trunc(240-x[i]*200/k+1));
end;
x[0]:=StrToFloat(fmMain.Edit5.Text);
A:=StrToFloat(fmMain.LabeledEdit2.Text);
B:=StrToFloat(fmMain.Edit2.Text);
for i:=1 to N do begin
x[i]:=(A*x[i-1]+B);
while x[i]>m do
x[i]:=x[i]-m;
fmMain.Image3.Canvas.Pen.Color:=clBlack;
fmMain.Image3.Canvas.Ellipse(Trunc(x[i-1]*200/k+10), Trunc(240-x[i]*200/k), Trunc(x[i-1]*200/k+10+1), Trunc(240-x[i]*200/k+1));
end;
x[0]:=StrToFloat(fmMain.Edit6.Text);
A:=StrToFloat(fmMain.LabeledEdit3.Text);
B:=StrToFloat(fmMain.Edit3.Text);
for i:=1 to N do begin
x[i]:=(A*x[i-1]+B);
while x[i]>m do
x[i]:=x[i]-m;
with fmMain.Image4.Canvas do begin
Pen.Color:=clBlack;
Ellipse(Trunc(x[i-1]*200/k+10), Trunc(240-x[i]*200/k), Trunc(x[i-1]*200/k+10+1), Trunc(240-x[i]*200/k+1));
end;
end;
T:=StrToInt(fmMain.Edit8.Text);
fmMain.Label17.Caption:=IntToStr(T);
fmMain.ListBox2.Clear;
fmMain.ListBox3.Clear;
fmMain.ListBox4.Clear;
A:=StrToFloat(fmMain.LabeledEdit1.Text);
B:=StrToFloat(fmMain.Edit1.Text);
k:=StrToFloat(fmMain.Edit7.Text);
m:=k;
x[0]:=StrToFloat(fmMain.Edit4.Text);
for i:=1 to T do begin
x[i]:=(A*x[i-1]+B);
while x[i]>m do
x[i]:=x[i]-m;
fmMain.ListBox2.Items.Add(FloatToStr(x[i]));
with fmMain.Image5.Canvas do begin
Pen.Color:=clBlack;
Ellipse(Trunc(x[i-1]*120/k+10), Trunc(160-x[i]*120/k), Trunc(x[i-1]*120/k+10+1), Trunc(160-x[i]*120/k+1));
end;
end;
x[0]:=StrToFloat(fmMain.Edit5.Text);
for i:=1 to T do begin
x[i]:=(A*x[i-1]+B);
while x[i]>m do
x[i]:=x[i]-m;
fmMain.ListBox3.Items.Add(FloatToStr(x[i]));
with fmMain.Image6.Canvas do begin
Pen.Color:=clBlack;
Ellipse(Trunc(x[i-1]*120/k+10), Trunc(160-x[i]*120/k), Trunc(x[i-1]*120/k+10+1), Trunc(160-x[i]*120/k+1));
end;
end;
x[0]:=StrToFloat(fmMain.Edit6.Text);
for i:=1 to T do begin
x[i]:=(A*x[i-1]+B);
while x[i]>m do
x[i]:=x[i]-m;
fmMain.ListBox4.Items.Add(FloatToStr(x[i]));
with fmMain.Image7.Canvas do begin
Pen.Color:=clBlack;
Ellipse(Trunc(x[i-1]*120/k+10), Trunc(160-x[i]*120/k), Trunc(x[i-1]*120/k+10+1), Trunc(160-x[i]*120/k+1));
end;
end;
{ fmMain.Label23.Caption:='Для А = '+fmMain.LabeledEdit2.Text+'; B = '+fmMain.Edit2.Text+'; Xo = '+fmMain.Edit5.Text+'.';
xH[0][0]:=StrToFloat(fmMain.Edit5.Text);
A:=StrToFloat(fmMain.LabeledEdit2.Text);
B:=StrToFloat(fmMain.Edit2.Text);
for i:=1 to 100000 do
for j:=1 to 100000 do begin
xH[i][j]:=(A*xH[i-1]+B);
while xH[i][j]>m do
xH[i][j]:=xH[i][j]-m;
end;
mem:=xH[100000][100000];
for i:=1 to 100000 do
for j:=1 to 100000 do begin
if xH[i][j]=mem then
fmMain.Edit10.Text:=fmMain.Edit10.Text+' '+IntToStr(i);
end; }
end;
procedure TfmMain.Button2Click(Sender: TObject);
begin
Close;
end;
procedure TfmMain.ApplicationEvents1Idle(Sender: TObject;
var Done: Boolean);
begin
fmMain.StatusBar1.Panels.Items[0].Text:=DateToStr(Date);
fmMain.StatusBar1.Panels.Items[1].Text:=TimeToStr(Time);
Done:=false;
end;
procedure TfmMain.FormCreate(Sender: TObject);
begin
fmMain.LabeledEdit1.Text:='3,7';
fmMain.LabeledEdit2.Text:='7,8';
fmMain.LabeledEdit3.Text:='15';
fmMain.Edit1.Text:='0';
fmMain.Edit2.Text:='4,2';
fmMain.Edit3.Text:='9,8';
fmMain.Edit4.Text:='0';
fmMain.Edit5.Text:='0,17';
fmMain.Edit6.Text:='0,5';
Clean;
fmMain.PageControl1.ActivePage:=TabSheet1;
fmMain.Label23.Caption:='Для А = 7,8; В = 3,7; Хо = 0,17.';
end;
procedure TfmMain.Clean;
begin
with fmMain.Image2.Canvas do begin
Brush.Color:=clWhite;
FillRect(Image2.Canvas.ClipRect);
Pen.Color:=clBlack;
Pen.Width:=2;
MoveTo(10, 240);
LineTo(240, 240);
LineTo(220, 235);
MoveTo(240, 240);
LineTo(220, 244);
MoveTo(10, 240);
LineTo(10, 10);
LineTo(5, 30);
MoveTo(10, 10);
LineTo(14, 30);
TextOut(20,10,'Xi+1');
TextOut(225, 220, 'Xi');
MoveTo(210, 243);
LineTo(210, 236);
MoveTo(5, 40);
LineTo(13, 40);
MoveTo(15, 40);
Pen.Width:=1;
Pen.Style:=psDot;
LineTo(220, 40);
MoveTo(210, 235);
LineTo(210, 30);
TextOut(215, 24, 'm='+fmMain.Edit7.Text);
Pen.Width:=2;
end;
with fmMain.Image3.Canvas do begin
Brush.Color:=clWhite;
FillRect(Image3.Canvas.ClipRect);
Pen.Color:=clBlack;
Pen.Width:=2;
MoveTo(10, 240);
LineTo(240, 240);
LineTo(220, 235);
MoveTo(240, 240);
LineTo(220, 244);
MoveTo(10, 240);
LineTo(10, 10);
LineTo(5, 30);
MoveTo(10, 10);
LineTo(14, 30);
TextOut(20,10,'Xi+1');
TextOut(225, 220, 'Xi');
MoveTo(210, 243);
LineTo(210, 236);
MoveTo(5, 40);
LineTo(13, 40);
MoveTo(15, 40);
Pen.Width:=1;
Pen.Style:=psDot;
LineTo(220, 40);
MoveTo(210, 235);
LineTo(210, 30);
TextOut(215, 24, 'm='+fmMain.Edit7.Text);
Pen.Width:=2;
end;
with fmMain.Image4.Canvas do begin
Brush.Color:=clWhite;
FillRect(Image4.Canvas.ClipRect);
Pen.Color:=clBlack;
Pen.Width:=2;
MoveTo(10, 240);
LineTo(240, 240);
LineTo(220, 235);
MoveTo(240, 240);
LineTo(220, 244);
MoveTo(10, 240);
LineTo(10, 10);
LineTo(5, 30);
MoveTo(10, 10);
LineTo(14, 30);
TextOut(20,10,'Xi+1');
TextOut(225, 220, 'Xi');
MoveTo(210, 243);
LineTo(210, 236);
MoveTo(5, 40);
LineTo(13, 40);
MoveTo(15, 40);
Pen.Width:=1;
Pen.Style:=psDot;
LineTo(220, 40);
MoveTo(210, 235);
LineTo(210, 30);
TextOut(215, 24, 'm='+fmMain.Edit7.Text);
Pen.Width:=2;
end;
with fmMain.Image5.Canvas do begin
Brush.Color:=clWhite;
FillRect(Image5.Canvas.ClipRect);
Pen.Color:=clBlack;
Pen.Width:=2;
MoveTo(10, 160);
LineTo(160, 160);
LineTo(140, 155);
MoveTo(160, 160);
LineTo(140, 164);
MoveTo(10, 160);
LineTo(10, 10);
LineTo(5, 30);
MoveTo(10, 10);
LineTo(14, 30);
TextOut(20,10,'Xi+1');
TextOut(145, 140, 'Xi');
MoveTo(130, 163);
LineTo(130, 156);
MoveTo(5, 40);
LineTo(13, 40);
MoveTo(15, 40);
Pen.Width:=1;
Pen.Style:=psDot;
LineTo(140, 40);
MoveTo(130, 155);
LineTo(130, 30);
TextOut(135, 24, 'm='+fmMain.Edit7.Text);
Pen.Width:=3;
end;
with fmMain.Image6.Canvas do begin
Brush.Color:=clWhite;
FillRect(Image6.Canvas.ClipRect);
Pen.Color:=clBlack;
Pen.Width:=2;
MoveTo(10, 160);
LineTo(160, 160);
LineTo(140, 155);
MoveTo(160, 160);
LineTo(140, 164);
MoveTo(10, 160);
LineTo(10, 10);
LineTo(5, 30);
MoveTo(10, 10);
LineTo(14, 30);
TextOut(20,10,'Xi+1');
TextOut(145, 140, 'Xi');
MoveTo(130, 163);
LineTo(130, 156);
MoveTo(5, 40);
LineTo(13, 40);
MoveTo(15, 40);
Pen.Width:=1;
Pen.Style:=psDot;
LineTo(140, 40);
MoveTo(130, 155);
LineTo(130, 30);
TextOut(135, 24, 'm='+fmMain.Edit7.Text);
Pen.Width:=3;
end;
with fmMain.Image7.Canvas do begin
Brush.Color:=clWhite;
FillRect(Image7.Canvas.ClipRect);
Pen.Color:=clBlack;
Pen.Width:=2;
MoveTo(10, 160);
LineTo(160, 160);
LineTo(140, 155);
MoveTo(160, 160);
LineTo(140, 164);
MoveTo(10, 160);
LineTo(10, 10);
LineTo(5, 30);
MoveTo(10, 10);
LineTo(14, 30);
TextOut(20,10,'Xi+1');
TextOut(145, 140, 'Xi');
MoveTo(130, 163);
LineTo(130, 156);
MoveTo(5, 40);
LineTo(13, 40);
MoveTo(15, 40);
Pen.Width:=1;
Pen.Style:=psDot;
LineTo(140, 40);
MoveTo(130, 155);
LineTo(130, 30);
TextOut(135, 24, 'm='+fmMain.Edit7.Text);
Pen.Width:=3;
end;
end;
procedure TfmMain.Edit9Change(Sender: TObject);
begin
try
Edit9.Text:=IntToStr(StrToInt(Edit9.Text));
if StrToInt(Edit9.Text)>100000 then
Edit9.Text:='100000';
except
ShowMessage('Неверный ввод данных.');
Edit9.Text:='10000';
end;
end;
procedure TfmMain.Edit1Change(Sender: TObject);
begin
try
Edit1.Text:=FloatToStr(StrToFloat(Edit1.Text));
except
ShowMessage('Неверный ввод данных.');
Edit1.Text:='0';
end;
end;
procedure TfmMain.Edit2Change(Sender: TObject);
begin
try
Edit2.Text:=FloatToStr(StrToFloat(Edit2.Text));
except
ShowMessage('Неверный ввод данных.');
Edit2.Text:='4,2';
end;
end;
procedure TfmMain.Edit3Change(Sender: TObject);
begin
try
Edit3.Text:=FloatToStr(StrToFloat(Edit3.Text));
except
ShowMessage('Неверный ввод данных.');
Edit3.Text:='7,8';
end;
end;
procedure TfmMain.Edit4Change(Sender: TObject);
begin
try
Edit4.Text:=FloatToStr(StrToFloat(Edit4.Text));
except
ShowMessage('Неверный ввод данных.');
Edit4.Text:='0';
end;
end;
procedure TfmMain.Edit5Change(Sender: TObject);
begin
try
Edit5.Text:=FloatToStr(StrToFloat(Edit5.Text));
except
ShowMessage('Неверный ввод данных.');
Edit5.Text:='0,17';
end;
end;
procedure TfmMain.Edit6Change(Sender: TObject);
begin
try
Edit6.Text:=FloatToStr(StrToFloat(Edit6.Text));
except
ShowMessage('Неверный ввод данных.');
Edit6.Text:='0,5';
end;
end;
procedure TfmMain.LabeledEdit1Change(Sender: TObject);
begin
try
fmMain.LabeledEdit1.Text:=FloatToStr(StrToFloat(fmMain.LabeledEdit1.Text));
except
ShowMessage('Неверный ввод данных.');
fmMain.LabeledEdit1.Text:='3,7';
end;
end;
procedure TfmMain.LabeledEdit2Change(Sender: TObject);
begin
try
fmMain.LabeledEdit2.Text:=FloatToStr(StrToFloat(fmMain.LabeledEdit2.Text));
except
ShowMessage('Неверный ввод данных.');
fmMain.LabeledEdit2.Text:='7,8';
end;
end;
procedure TfmMain.LabeledEdit3Change(Sender: TObject);
begin
try
fmMain.LabeledEdit3.Text:=FloatToStr(StrToFloat(fmMain.LabeledEdit3.Text));
except
ShowMessage('Неверный ввод данных.');
fmMain.LabeledEdit3.Text:='15';
end;
end;
procedure TfmMain.Edit7Change(Sender: TObject);
begin
try
Edit7.Text:=FloatToStr(StrToFloat(Edit7.Text));
except
ShowMessage('Неверный ввод данных.');
Edit7.Text:='0,5';
end;
end;
procedure TfmMain.Edit8Change(Sender: TObject);
begin
try
Edit8.Text:=IntToStr(StrToInt(Edit8.Text));
if StrToInt(Edit8.Text)>100000 then
Edit8.Text:='100000';
except
ShowMessage('Неверный ввод данных.');
Edit8.Text:='80';
end;
end;
end.