Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Лабораторна робота № 2. Дисципліна „Моделювання складних систем ” ⇐ ПредыдущаяСтр 4 из 4
Дисципліна „Моделювання складних систем ” Тема «Датчики псевдовипадкових чисел»
Виконав: Ст. гр. КІ-16-С Резенко М.С. Дата: 19.09.2016
Підпис: ________________
Перевірив: Доцент Петренюк В.І.
Дата: ______________
Підпис: ______________
Кропивницький – 2016 р. Завдання: Скласти програму датчика псевдовипадкових чисел за однією з відомих формул і протестувати програму. Зробити висновок про її якість.
Xn+1 = (a*Xn +c) mod m, де X0 > =0, m> X0, m> a, m> c. Така послiдовнiсть зветься лiнiйною конгруентною. Перiодом такої послiдовностi буде m тодi i тiльки тодi, коли виконується умова: 1. с та m - взаємно простi числа. 2. a-1 кратне p для довiльного p, що є дiльником m. 3. a-1 кратне 4, якщо m кратне 4. Статистика (тестування): k V = 1/n (Σ ((Y2 /Ps) - n)) s=1 s
#include < vcl.h> #pragma hdrstop #include " Unit1.h" #pragma package(smart_init) #pragma resource " *.dfm" TForm1 *Form1; unsigned __int64 x0; //--------------------------------------------------------------------------- __fastcall TForm1:: TForm1(TComponent* Owner) : TForm(Owner) { } //-------------------------------------------------------- // програма датчика псевдо випадкових чисел int __fastcall TForm1:: Progr_rand(int n) { unsigned __int64 m = 9576890767, a = 1500450271, xn; int c = 7; xn = (a*x0 + c)%m; x0 = xn; return x0%n; } //--------------------------------------------------------------------------- // тестування void __fastcall TForm1:: Button1Click(TObject *Sender) { int pos=1; long dosl, p, k; ProgressBar1-> Min = 1; ProgressBar1-> Max = 27; long kilk_dosl, i, chastota[11]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int ind; randomize(); double E_i, V=0; double ogid[]={0.02777777777777777777777777778, 0.05555555555555555555555555556, 0.08333333333333333333333333333, 0.11111111111111111111111111111, 0.13888888888888888888888888889, 0.16666666666666666666666666667, 0.13888888888888888888888888889, 0.11111111111111111111111111111, 0.08333333333333333333333333333, 0.05555555555555555555555555556, 0.02777777777777777777777777778}; kilk_dosl = Edit1-> Text.ToInt(); //кількість дослідів p = (kilk_dosl/ProgressBar1-> Max)-(kilk_dosl%ProgressBar1-> Max); k = p; x0 = GetTickCount(); for(i=0; i< kilk_dosl; i++) { // якщо білдер if(RadioButton1-> Checked) { ind=random(5); ind=ind+random(5); } // якщо моєю програмою else { ind = Progr_rand(5); ind = ind + Progr_rand(5); } chastota[ind]++; //--------------------------------------- if(i==p){ ProgressBar1-> Position = pos; pos++; p+=k; } //--------------------------------------- } //по частоті обчислюємо V for(i=0; i< 11; i++) { E_i = kilk_dosl*ogid[i]; V+=((chastota[i]-E_i)*(chastota[i]-E_i))/E_i; } Edit2-> Text = V; // виводимо на екран } //--------------------------------------------------------------------------- void __fastcall TForm1:: RadioButton1Click(TObject *Sender) { RadioButton2-> Checked = false; } //---------------------------------------------------------------------------
Рисунок 1.1 – Дослід 1 за допомогою програми
Рисунок 1.2 – Дослід за допомогою builder Міністерство освіти і науки України Кропивницький національний технічний університет Кафедра програмування та захисту інформації
|