Лабораторная работа №1 / Отчет
.docМинистерство Образования Российской Федерации
Уфимский Государственный Авиационный Технический Университет
Кафедра ТК
Отчет по лабораторной работе №1
по предмету «Теоретические основы автоматизации управления»
на тему: Структурно-топологические характеристики систем и их применение
Выполнил: студент
гр.Т28-320 ФИРТ
Кривошеев А.С
Проверила: Валеева Р.Г.
Уфа 2005
Цель работы
Изучение методов получения на ЭВМ равномерно распределенных псевдослучайных чисел и тестов проверки их качества.
Листинг программы:
Unit1.cpp
#include <vcl.h>
#include <stdio.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
FILE *out;
int N;
double *x_m1;
double *x_m2;
double *x_m3;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
N = StrToInt(Edit4->Text);
}
void TForm1:: NewHTMLReport(void)
{
fprintf(out, "<html>\n");
fprintf(out, "<head>\n");
fprintf(out, " <title>Генерация случайных чисел и проверка их качества</title>\n");
fprintf(out, " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n");
fprintf(out, " <style>\n");
fprintf(out, " body { font-family: Verdana; }\n");
fprintf(out, " th { font-size: 9pt; padding: 3px; background-color: #e0e0e0; }\n");
fprintf(out, " td { font-size: 9pt; padding: 3px; }\n");
fprintf(out, " </style>\n");
fprintf(out, "</head>\n");
fprintf(out, "<body>\n");
}
void TForm1:: WriteGenResults(double *x,char *label)
{
fprintf(out, "<b><font size=3 Color = darkblue>%s</font></b>",label);
fprintf(out, ",<br><b><font size=2 Color = darkblue>Сгенеренные числа</font></b>");
fprintf(out, "<table cellpadding=\"0\" cellspacing=\"0\" border=\"1\" >\n");
fprintf(out, "<tr>");
for(int i=0;i<N;i++)
{
fprintf(out, "<td>%.7f</td>",x[i]);
if(!fmodl(i+1,13)) fprintf(out, "</tr><tr>\n");
}
fprintf(out, "</tr>\n");
fprintf(out, "</table><p>");
}
double TForm1:: avq(double x,double y)
{
char x_str[256];
double fraction, integer,integer2;
strcpy(x_str,FloatToStr(x).c_str());
int x_lng = strlen(x_str) - 2;
if(fmod(x_lng,2)) x_lng++;
x_lng/=2;
double xrez = x*y*pow10(3*x_lng);
fraction = modf(xrez, &integer);
xrez = modf(integer/pow10(2*x_lng),&integer2);
return(xrez);
}
double TForm1:: DecToBin(int x)
{
int i=0,n,l;
char bin[20],arr[20];
do{
if(fmod(x,2)) bin[i] ='1';
else bin[i] = '0';
x/=2;
i++;
}while(x);
n = i;
for(l=0;l<i;l++) arr[l]=bin[--n];
arr[l] = '\0';
return(StrToFloat(arr));
}
int TForm1:: BinToDec(double x)
{
int rez=0,i=0;
modf(x,&x);
char bin[16];
strcpy(bin, FloatToStr(x).c_str());
int bin_lng = strlen(bin);
do{
rez += StrToInt(bin[bin_lng-1])*pow(2,i);
bin_lng--;i++;
}while(bin_lng);
return(rez);
}
double TForm1:: DoubleCut(double x,int g)
{
char d_arr[16];
strcpy(d_arr, FloatToStr(x).c_str());
int arr_lng = strlen(d_arr);
int cmp = arr_lng - g;
if(cmp>0)
for(int i=0;i<cmp;i++) d_arr[i] = '0';
return(StrToFloat(d_arr));
}
void TForm1::AvqMethod()
{
x_m1 = new double[N];
x_m1[0]=StrToFloat(Edit1->Text);
for(int i=0;i<N-1;i++) x_m1[i+1] = avq(x_m1[i],x_m1[i]);
WriteGenResults(x_m1,cbxAvq->Caption.c_str());
}
void TForm1::AvmMethod(void)
{
x_m2 = new double[N];
x_m2[0]=StrToFloat(Edit1->Text);
x_m2[1]=StrToFloat(Edit2->Text);
for(int i=1;i<N-1;i++) x_m2[i+1] = avq(x_m2[i],x_m2[i-1]);
WriteGenResults(x_m2,cbxAvm->Caption.c_str());
}
void TForm1::MplMethod()
{
double X0,X1;
double h=5.0,temp;
x_m3 = new double[N];
int g=8;
X0=7;
for(int i=0;i<N;i++)
{
temp=X0*h;
temp = DecToBin(temp);
X1 = DoubleCut(temp,g);
X1 = BinToDec(X1);
x_m3[i] = X1/pow(2,g);
X0=X1;
}
WriteGenResults(x_m3,cbxMpl->Caption.c_str());
}
void TForm1::RndTest(double *x)
{
int *s_ln = new int[N];
int l=0,Z=0,Zm=0;
int *z = new int[10];
double temp=0;
for(int i=0;i<N;i++) s_ln[i]=0;
for(int i=0;i<N;i++) {
if(x[i]>=0.5) s_ln[l]++;
else l++;
}
for(int t=1;t<10;t++) {
z[t]=0;
for(int k=0;k<l;k++) if(s_ln[k]==t) z[t]++;
Z+=z[t];
}
for(int l=5;l<10;l++) Zm+= z[l];
for(int l=1;l<5;l++)
temp = pow((z[l] - 9*pow10(-l)*Z),2)/(9*pow10(-l)*Z);
temp += pow((Zm - pow10(-4)*Z),2)/(pow10(-4)*Z);
double z_lim = 0.5 * (N+1 - 1.65*sqrt(N-1));
double z_pr = 0.25 * (N - 1.65*sqrt(N+1));
double l_max = 33 *(log10(N)+1);
fprintf(out, "<b><font size=2 Color = darkblue>Тест проверки \"случайности\" последовательности</b>");
fprintf(out, "<table cellpadding=\"0\" cellspacing=\"0\" border=\"1\" >\n");
fprintf(out, "<tr>");
for(int i=1;i<5;i++) fprintf(out, "<th width=60>z[%d]</th>",i);
fprintf(out, "<th width=50>z[m+1]</th>");
fprintf(out, "<th width=50>Н.гр.</th>");
fprintf(out, "<th width=50>X^2</th>");
fprintf(out, "<th width=50>В.гр.</th>");
fprintf(out, "<th width=50>Z^n</th>");
fprintf(out, "<th width=50>Zп.р,Zв.р</th>");
fprintf(out, "<th width=50>l_max</th>");
fprintf(out, "</tr><tr>\n");
for(int i=1;i<5;i++) fprintf(out,"<td>%d</td>",z[i]);
fprintf(out, "<td>%d</td>",Zm);
fprintf(out, "<td width=50>0.71</td>");
fprintf(out, "<td width=50>%.2f</td>",temp);
fprintf(out, "<td width=50>9.5</td>");
fprintf(out, "<td width=50>%f</td>",z_lim);
fprintf(out, "<td width=50>%f</td>",z_pr);
fprintf(out, "<td width=50>%.f</th>",l_max);
fprintf(out, "</tr>\n");
fprintf(out, "</table><p>");
}
void TForm1:: RsprTest(double *x)
{
int *v = new int [10];
double temp=0,E=0,D=0;
for(int l=0;l<10;l++) {
v[l]=0;
for(int i=0;i<N;i++)
if(x[i]>=l*0.1 && x[i]<(l+1)*0.1) v[l]++;
}
for(int i=0;i<10;i++) temp+= pow(v[i] - 0.1*N,2)/(0.1*N);
for(int i=0;i<N;i++) E+=x[i];
double M = E/N;
for(int i=0;i<N;i++) D+= pow(x[i] - M,2);
D/=(N-1);
fprintf(out, "<b><font size=2 Color = darkblue>Проверка равномерности закона распределения</font></b>");
fprintf(out, "<table cellpadding=\"0\" cellspacing=\"0\" border=\"1\" >\n");
fprintf(out, "<tr>");
for(int i=0;i<10;i++) fprintf(out, "<th >v[%d]</th>",i);
fprintf(out, "<th width=50>Н.гр.</th>");
fprintf(out, "<th width=50>X^2</th>");
fprintf(out, "<th width=50>В.гр.</th>");
fprintf(out, "<th width=50>M[x]</th>");
fprintf(out, "<th width=50>D</th>");
fprintf(out, "</tr><tr>\n");
for(int i=0;i<10;i++) fprintf(out, "<td>%d</td>",v[i]);
fprintf(out, "<td>3.32</td>");
fprintf(out, "<td>%.2f</td>",temp);
fprintf(out, "<td>16.9</td>");
fprintf(out, "<td>%f</td>",M);
fprintf(out, "<td>%f</td>",D);
fprintf(out, "</tr>\n");
fprintf(out, "</table><p>");
}
void TForm1:: KorrTest(double *x)
{
double tmp1=0,tmp2=0,tmp3=0;
for(int i=0;i<N;i++) {
tmp1+=(i+1)*x[i];
tmp2+=x[i];
tmp3+=pow(x[i],2);
}
double p = ((tmp1/N) - ((N+1)*tmp2)/(2*N))/(sqrt((tmp3/N - pow(tmp2/N,2))*(N*N-1)/12));
double p_max = 1.95 * (1 - p*p)/sqrt(N);
fprintf(out, "<b><font size=2 Color = darkblue>Проверка независимости последовательности</font></b>>");
fprintf(out, "<table cellpadding=\"0\" cellspacing=\"0\" border=\"1\" >\n");
fprintf(out, "<tr>");
fprintf(out, "<th width=60>P(x)</th>");
fprintf(out, "<th width=50>Zb</th>");
fprintf(out, "<th width=50>Pmax</th>");
fprintf(out, "</tr><tr>\n");
fprintf(out, "<td>%f</td>",p);
fprintf(out, "<td>1.95</td>");
fprintf(out, "<td>%f</td>",p_max);
fprintf(out, "</tr>\n");
fprintf(out, "</table><p>");
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
out = fopen("rezults.htm", "w");
NewHTMLReport();
if(cbxAvq->Checked) {
AvqMethod();
if(cbxRnd->Checked) RndTest(x_m1);
if(cbxRspr->Checked) RsprTest(x_m1);
if(cbxKorr->Checked) KorrTest(x_m1);
}
if(cbxAvm->Checked) {
AvmMethod();
if(cbxRnd->Checked) RndTest(x_m2);
if(cbxRspr->Checked) RsprTest(x_m2);
if(cbxKorr->Checked) KorrTest(x_m2);
}
if(cbxMpl->Checked) {
MplMethod();
if(cbxRnd->Checked) RndTest(x_m3);
if(cbxRspr->Checked) RsprTest(x_m3);
if(cbxKorr->Checked) KorrTest(x_m3);
}
fcloseall();
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();
}
Работа программы
Сгенеренный HTML файл
Метод серединных квадратов, Сгенеренные числа
0.1234000 |
0.5227000 |
0.3215000 |
0.3362000 |
0.3030000 |
0.0000001 |
0.0000025 |
0.0006397 |
0.9214599 |
0.6872359 |
0.1710043 |
0.5769443 |
0.5838413 |
0.7537627 |
0.6172278 |
0.8130530 |
0.7457671 |
0.4332707 |
0.3892622 |
0.9581565 |
0.6389938 |
0.8907208 |
0.2596598 |
0.4676849 |
0.2948070 |
0.0594262 |
0.9440768 |
0.5319149 |
0.0004212 |
0.3717396 |
0.2215495 |
0.1582113 |
0.5770195 |
0.1417493 |
0.7236597 |
0.4240614 |
0.4836686 |
0.8341734 |
0.1471933 |
0.7567410 |
0.0142147 |
0.7327912 |
0.2192093 |
0.6946289 |
0.5178409 |
0.2655870 |
0.7843045 |
0.4203531 |
0.6013081 |
0.8956415 |
0.8007302 |
0.2135354 |
0.7212040 |
0.3356370 |
0.7908672 |
0.1882928 |
0.4663150 |
0.8607641 |
0.2716872 |
0.7475952 |
0.6441515 |
0.6299798 |
0.3034648 |
0.8477442 |
0.2955691 |
0.8166568 |
0.4626670 |
0.9707062 |
0.6755358 |
0.4080270 |
0.3940094 |
0.8700543 |
0.1570649 |
0.2749878 |
0.9430291 |
0.4667294 |
0.9106939 |
0.1587732 |
0.3901175 |
0.2318165 |
0.7141128 |
0.2688505 |
0.6246591 |
0.3145635 |
0.0110248 |
0.5950931 |
0.1212565 |
0.4252300 |
0.3487808 |
0.1012212 |
0.5689203 |
0.6749655 |
0.2283973 |
0.4518182 |
0.6240863 |
0.4863240 |
0.6660019 |
0.6683607 |
0.8864249 |
0.6779048 |
0.9413496 |
0.5648063 |
0.9941856 |
0.8843830 |
0.0990664 |
0.5846938 |
0.5206841 |
0.0467552 |
0.2408311 |
0.0219869 |
0.3767101 |
0.1218507 |
0.8339348 |
0.9102937 |
0.0055582 |
0.0033664 |
0.7956553 |
0.6089449 |
0.6442068 |
0.8405783 |
0.0615804 |
0.9906012 |
0.0413523 |
0.9169955 |
0.2793115 |
0.9278210 |
0.4279730 |
0.8871878 |
0.1048603 |
0.9979723 |
|
|
|
|
|
|
Тест проверки "случайности" последовательности
z[1] |
z[2] |
z[3] |
z[4] |
z[m+1] |
Н.гр. |
X^2 |
В.гр. |
Z^n |
Zп.р,Zв.р |
l_max |
23 |
7 |
3 |
1 |
2 |
0.71 |
1136.01 |
9.5 |
56.129801 |
27.778722 |
103 |
Проверка равномерности закона распределения
v[0] |
v[1] |
v[2] |
v[3] |
v[4] |
v[5] |
v[6] |
v[7] |
v[8] |
v[9] |
Н.гр. |
X^2 |
В.гр. |
M[x] |
D |
14 |
12 |
14 |
12 |
13 |
11 |
16 |
11 |
14 |
13 |
3.32 |
1.69 |
16.9 |
0.497798 |
0.088411 |
Проверка независимости последовательности>
P(x) |
Zb |
Pmax |
0.089466 |
1.95 |
0.169657 |
Метод середины произведения, Сгенеренные числа
0.1234000 |
0.9876500 |
0.8760100 |
0.6499994 |
0.6971641 |
0.9567455 |
0.2615959 |
0.1692747 |
0.4365219 |
0.2842928 |
0.4484211 |
0.2819252 |
0.7020452 |
0.4909000 |
0.2467882 |
0.1713305 |
0.7035445 |
0.7849619 |
0.7939964 |
0.2023476 |
0.9461152 |
0.0615897 |
0.0727433 |
0.3140718 |
0.7429672 |
0.0710851 |
0.0477639 |
0.1037785 |
0.8519762 |
0.8794458 |
0.3621682 |
0.9571070 |
0.0569339 |
0.0481381 |
0.1146974 |
0.9687534 |
0.3074315 |
0.5471730 |
0.5171299 |
0.5490421 |
0.1176226 |
0.0228225 |
0.5990394 |
0.0050620 |
0.3527632 |
0.6776337 |
0.5432593 |
0.4176235 |
0.4156700 |
0.2416108 |
0.2458315 |
0.2970577 |
0.3582657 |
0.6744748 |
0.3890897 |
0.0672114 |
0.8736710 |
0.3048280 |
0.3473562 |
0.8518473 |
0.9269937 |
0.7847285 |
0.1731151 |
0.2293062 |
0.6188408 |
0.3916318 |
0.2537476 |
0.4045722 |
0.2877349 |
0.1251715 |
0.7824017 |
0.5481121 |
0.9452895 |
0.1077583 |
0.8934378 |
0.9064664 |
0.4116035 |
0.2629024 |
0.7945906 |
0.0172758 |
0.4376557 |
0.8687301 |
0.5632382 |
0.9104583 |
0.6348606 |
0.2417358 |
0.9774491 |
0.7346028 |
0.7941681 |
0.2425697 |
0.2596228 |
0.7133029 |
0.3660246 |
0.7762699 |
0.8232870 |
0.4740549 |
0.7598936 |
0.0316955 |
0.2404292 |
0.3390440 |
0.8854304 |
0.4168000 |
0.0782847 |
0.6405997 |
0.7634648 |
0.0780755 |
0.7709590 |
0.2173158 |
0.6579842 |
0.9673403 |
0.0158319 |
0.7687863 |
0.9872901 |
0.0124579 |
0.3880823 |
0.7976023 |
0.2848310 |
0.6182847 |
0.6067636 |
0.0424254 |
0.0680826 |
0.0444237 |
0.8268103 |
0.1609007 |
0.6073164 |
0.9205633 |
0.4672345 |
0.0429020 |
0.5067964 |
0.9100854 |
|
|
|
|
|
|
Тест проверки "случайности" последовательности
z[1] |
z[2] |
z[3] |
z[4] |
z[m+1] |
Н.гр. |
X^2 |
В.гр. |
Z^n |
Zп.р,Zв.р |
l_max |
16 |
9 |
5 |
1 |
1 |
0.71 |
343.25 |
9.5 |
56.129801 |
27.778722 |
103 |
Проверка равномерности закона распределения
v[0] |
v[1] |
v[2] |
v[3] |
v[4] |
v[5] |
v[6] |
v[7] |
v[8] |
v[9] |
Н.гр. |
X^2 |
В.гр. |
M[x] |
D |
19 |
10 |
18 |
12 |
11 |
8 |
11 |
17 |
10 |
14 |
3.32 |
10.00 |
16.9 |
0.478464 |
0.094537 |
Проверка независимости последовательности>
P(x) |
Zb |
Pmax |
0.046586 |
1.95 |
0.170655 |
Мультипликативный метод, Сгенеренные числа
0.1367188 |
0.6835938 |
0.4179688 |
0.0898438 |
0.4492188 |
0.2460938 |
0.2304688 |
0.1523438 |
0.7617188 |
0.8085938 |
0.0429688 |
0.2148438 |
0.0742188 |
0.3710938 |
0.8554688 |
0.2773438 |
0.3867188 |
0.9335938 |
0.6679688 |
0.3398438 |
0.6992188 |
0.4960938 |
0.4804688 |
0.4023438 |
0.0117188 |
0.0585938 |
0.2929688 |
0.4648438 |
0.3242188 |
0.6210938 |
0.1054688 |
0.5273438 |
0.6367188 |
0.1835938 |
0.9179688 |
0.5898438 |
0.9492188 |
0.7460938 |
0.7304688 |
0.6523438 |
0.2617188 |
0.3085938 |
0.5429688 |
0.7148438 |
0.5742188 |
0.8710938 |
0.3554688 |
0.7773438 |
0.8867188 |
0.4335938 |
0.1679688 |
0.8398438 |
0.1992188 |
0.9960938 |
0.9804688 |
0.9023438 |
0.5117188 |
0.5585938 |
0.7929688 |
0.9648438 |
0.8242188 |
0.1210938 |
0.6054688 |
0.0273438 |
0.1367188 |
0.6835938 |
0.4179688 |
0.0898438 |
0.4492188 |
0.2460938 |
0.2304688 |
0.1523438 |
0.7617188 |
0.8085938 |
0.0429688 |
0.2148438 |
0.0742188 |
0.3710938 |
0.8554688 |
0.2773438 |
0.3867188 |
0.9335938 |
0.6679688 |
0.3398438 |
0.6992188 |
0.4960938 |
0.4804688 |
0.4023438 |
0.0117188 |
0.0585938 |
0.2929688 |
0.4648438 |
0.3242188 |
0.6210938 |
0.1054688 |
0.5273438 |
0.6367188 |
0.1835938 |
0.9179688 |
0.5898438 |
0.9492188 |
0.7460938 |
0.7304688 |
0.6523438 |
0.2617188 |
0.3085938 |
0.5429688 |
0.7148438 |
0.5742188 |
0.8710938 |
0.3554688 |
0.7773438 |
0.8867188 |
0.4335938 |
0.1679688 |
0.8398438 |
0.1992188 |
0.9960938 |
0.9804688 |
0.9023438 |
0.5117188 |
0.5585938 |
0.7929688 |
0.9648438 |
0.8242188 |
0.1210938 |
0.6054688 |
0.0273438 |
0.1367188 |
0.6835938 |
|
|
|
|
|
|
Тест проверки "случайности" последовательности
z[1] |
z[2] |
z[3] |
z[4] |
z[m+1] |
Н.гр. |
X^2 |
В.гр. |
Z^n |
Zп.р,Zв.р |
l_max |
12 |
8 |
0 |
2 |
4 |
0.71 |
6312.81 |
9.5 |
56.129801 |
27.778722 |
103 |
Проверка равномерности закона распределения
v[0] |
v[1] |
v[2] |
v[3] |
v[4] |
v[5] |
v[6] |
v[7] |
v[8] |
v[9] |
Н.гр. |
X^2 |
В.гр. |
M[x] |
D |
12 |
15 |
12 |
12 |
14 |
12 |
15 |
12 |
12 |
14 |
3.32 |
1.23 |
16.9 |
0.502464 |
0.083961 |
Проверка независимости последовательности>
P(x) |
Zb |
Pmax |
0.148262 |
1.95 |
0.167267 |
Вывод: