Перевірка гіпотези про нормальність закону розподілу експериментальних даних
1. Мета роботи
Змоделювати роботу генератора випадкових двійкових чисел, що має закон розподілу, заданого з допомогою моделі Гільберта; обмеженої послідовності 0 та 1.
2. Основна частина
В якості вхідних послідовності вибрали наступну:
2) 1100101010111100001000010000001010101111000010010000100111100100
Моделювання випадкової послідовності проводилася засобами мови С + + (середа Borland Builder C + + )
Текст програми
генератор двійковий число Гільберт
// --------------------------------------------- ------------------------------
# include
# include
# include
# include
// --------------------------------------------- ------------------------------
# include
# pragma hdrstop
# include "Systemsimulation.h"
// --------------------------------------------- ------------------------------
# pragma package (smart_init)
# pragma resource "*. dfm"
TMainForm * MainForm;
// --------------------------------------------- ------------------------------
__fastcall TMainForm :: TMainForm (TComponent * Owner)
: TForm (Owner)
{
}
// --------------------------------------------- ------------------------------
// Вивід в полі RichEdit із завданням кольору виведеного тексту
// REditAddColor (RichEdit1, "Test", clRed);
void __fastcall TMainForm :: REditAddColor (TRichEdit * RichEditX, AnsiString Text, TColor Color)
{
// HideCaret (RichEditX-> Handle);
RichEditX-> SelAttributes-> Color = Color;// задаємо колір тексту
RichEditX-> Lines-> Add (Text) ;//виводимо текст
RichEditX-> Perform (EM_LINEINDEX, RichEditX-> Lines-> Count-1, 0) ;//встановлюємо позицію каретки
RichEditX-> Perform (EM_SCROLLCARET, 0, 0) ;//прокручуємо поле до позиції каретки
}
// --------------------------------------------- ------------------------------
// Грунтуючись на вхідної послідовності формуємо закон розподілу
void __fastcall TMainForm :: ZakonRaspr (AnsiString InSequence, double * P)
{
// P0// P1// P00// P01// P10// P11
P [0] = 0; P [1] = 0; P [2] = 0; P [3] = 0; P [4] = 0; P [5] = 0;
int i;
// за певним алгоритму формуємо закон розподілу
for (i = 1; i <= InSequence.Length (); i + = 2)
{
switch (((AnsiString) InSequence [i] + (AnsiString) InSequence [i +1]). ToInt ())
{
case 00:
{
P [0] + = 2 ;//P0
P [2] + +;// P00
} break;
case 01:
{
P [0] + + ;//P0
P [1] + + ;//P1
P [3] + + ;//P01
} break;
case 10:
{
P [1] + + ;//P1
P [0] + + ;//P0
P [4] + + ;//P10
} break;
case 11:
{
P [1] + = 2 ;//P1
P [5] + +;// P11
} break;
}
}
P [2]/= InSequence.Length ()/2 ;//P00/(довжина вхідної послідовності розділена на 2)
P [3]/= InSequence.Length ()/2 ;//P01/(довжина вхідної послідовності розділена на 2)
P [4]/= InSequence.Length ()/2 ;//P10/(довжина вхідної послідовності розділена на 2)
P [5]/= InSequence.Length ()/2 ;//P11/(довжина вхідної послідовності розділена на 2)
P [0]/= InSequence.Length ();// P0/(довжина вхідної послідовності)
P [1]/= InSequence.Length ();// P1/(довжина вхідної послідовності)
}
// --------------------------------------------- ------------------------------
// генерує випадкове число з плаваючою комою в заданому діапазоні
double __fastcall TMainForm :: Randouble (double min, double max)
{return (Double) rand ()/(double) RAND_MAX * (max-min) + min;
}
// --------------------------------------------- ------------------------------
// генеруємо послідовність з випадкових чисел
AnsiString GenSequence;
AnsiString __fastcall TMainForm :: GenModel (double * P, int Count)
{
double Pi1, Pi2, Pi3, Pi4;
GenSequence = "";
Pi1 = P [2];
Pi2 = P [2] + P [3];
Pi3 = P [2] + P [3] + P [4];
Pi4 = P [2] + P [3] + P [4] + P [5];
double rnd;
for (Int i = 0; i
{
rnd = Randouble (0.0, 1.0);
if (Rnd
if ((Rnd> = Pi1) && (rnd
if ((Rnd> = Pi2) && (rnd
if ((Rnd> = Pi3) && (rnd
return GenSequence;}
// --------------------------------------------- ------------------------------
// моделювання випадкової послідовності двійкових чисел
void __fastcall TMainForm :: ModelSlPosl (double * P, int Count, bool Prn)
{
double ** Experiment = new double * [3];
for (Int i = 0; i <3; i + +)
{experiment [i] = New double [6];
ZakonRaspr (GenModel (P, Count), experiment [i]);
}
REditAddColor (RichEdit1, clBlue);
REditAddColor (RichEdit1, "| Довжина | | Номер досвіду | Середнє | Теоретичне | | ", ClBlue);
REditAddColor (RichEdit1, "| Послідовності | Параметри | 1 | 2 | 3 | значення | значення | Помилка | ", clBlue);
REditAddColor (RichEdit1, clBlue);
AnsiString PrnScr;
double SrZnach, Err;
AnsiString Prametru [6] = {"P0", "P1", "P00", "P01", "P10", "P11"};
for (int i = 0; i <= 5; i + +)
{SrZnach = (Experiment [0] [i] + experiment [1] [i] + experiment [2] [i])/3;
Err = Fabs (P [i] - (experiment [0] [i] + experiment [1] [i] + experiment [2] [i])/3);
PrnScr.sprintf ("|% 18d |% 9s |% 5.3lf |% 5.3lf |% 5.3lf |% 9.3lf |% 15.3lf |% 6.3lf |", Count, Prametru [i], experiment [0] [i], experiment [1] [i], experiment [2] [i], SrZnach, P [i], Err); REditAddColor (RichEdit1, PrnScr, clBlue);
switch (i)
{case 0:
{LineP0-> Add (SrZnach, "При N = "+ (AnsiString) Count, clRed);
if (Prn) LineP0-> Add (P [i], "Теорет.", clRed);
} break;
case 1:
{
LineP1-> Add (SrZnach, "При N = "+ (AnsiString) Count, clGreen);
if (Prn) LineP1-> Add (P [i], "Теорет.", clGreen);
} break;
}
}
for (Int i = 0; i <3; i + +) {delete [] experiment [i];}
delete [] experiment;
}
// --------------------------------------------- ------------------------------
void __fastcall TMainForm :: StartSimulationClick (TObject * Sender)
{LineP0-> Clear ();
LineP1-> Clear ();
RichEdit1-> Lines-> Clear ();
StartSimulation-> Enabled = False;
double P [6];
// формуємо закон розподілу
ZakonRaspr (InSequence-> Lines-> Strings [0], P);
// проводимо моделювання випадкової послідовності двійкових чисел
// для різних довжин послідовностей
ModelSlPosl (P, 100);
ModelSlPosl (P, 1000);
ModelSlPosl (P, 10000, true);
StartSimulation-> Enabled = True;}
// --------------------------------------------- ------------------------------
При моделюванні використовувався генератор випадкових чисел з рівномірним розподілом: при моделюванні події А, що настає з імовірністю Р, береться випадкове число х з рівномірного розподілу на інтервалі (0, 1) і порівнюється з Р. Якщо х ≤ Р, то вважається, що подія А наступило, в іншому випадку настало подія ДЂ.
Моделювання випадкової послідовності двійкових чисел проводилося для різних довжин послідовностей (N = 100, N = 1000, N = 10000), результати якого представлені на рис. 1, 2
Рис. 1
Рис. 2
3. Висновок
При моделюванні
У ході виконання завдання змоделювали роботу генератора випадкових двійкових чисел, підкоряється рівномірному закону розподілу, заданого за допомогою моделі Гільберта; обмеженої послідовності 0 та 1. Ми представили закони розподілу випадкових чисел, заданих в неявному вигляді, у вигляді гістограм, а далі за допомогою мови програмування С + + забезпечили процедуру генерування випадкових чисел, з різними тривалостями їх послідовності, відповідних вищевказаного закону розподілу. З рис.1, 2 видно, що при збільшенні довжини послідовності експериментально отримані дані наближаються до теоретичних даними.