Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчёт по зюзе.doc
Скачиваний:
3
Добавлен:
11.07.2019
Размер:
502.27 Кб
Скачать

Федеральное агентство по образованию

Московский Государственный Текстильный Университет

им. А.Н.Косыгина

Лабораторная работа №1

по теме:

«Генерация последовательностей псевдослучайных

чисел (ПСЧ)»

Выполнила:

студентка группы 42-08

Нонина Д.Е

Проверила:

Зензинова Ю.Б.

Москва 2011

Цель работы.

  1. Исследование конгруэнтного мультипликативного алгоритма генерации ППСЧ

  2. Исследование статистических свойств ППСЧ

Задание.

1). Написать программу генерации ППСЧ заданной длины ( ) с использованием мультипликативного алгоритма. Выбрать так, чтобы .

2). Построить графики функции в координатах при трёх заданных значениях параметров и .

3). Выполнить генерацию значений ПСЧ для первого варианта значений параметров и , и трёх заданных стартовых чисел . Построить аналогичные графики трёх последовательностей.

4). Разработать алгоритм, нарисовать блок-схему, написать и отладить программу определения отрезка апериодичности и периода ППСЧ.

Часть 2

  1. Выполнить проверку сгенерированной ППСЧ на соответствие равномерному закону распределения с заданными параметрами и однородность распределения последовательности при разбиении ППСЧ на M подпоследовательностей. Использовать критерии Колмогорова и хи–квадрат. Написать программы для вычисления расчетных значений этих критериев.

  2. Выполнить проверку сгенерированной ППСЧ на соответствие гипотезе об отсутствии тренда среднего, используя критерий серий (четные номера вариантов) и критерий «восходящих» и «нисходящих» серий (нечетные номера вариантов).

  3. Выполнить проверку гипотезы об однородности дисперсии сгенерированной ППСЧ. Для этого вычислить точечные оценки дисперсии для всех подпоследовательностей ППСЧ и сравнить их с гипотетической дисперсией равномерного закона распределения по критерию хи-квадрат.

Вариант №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.