Скачиваний:
3
Добавлен:
02.05.2014
Размер:
9.09 Кб
Скачать
//---------------------------------------------------------------------------

#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,8)) 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();
}
//---------------------------------------------------------------------------

Соседние файлы в папке Project