Аналіз генераторів випадкових чисел

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
КН
Кафедра:
Кафедра електронних обчислювальних машин

Інформація про роботу

Рік:
2005
Тип роботи:
Лабораторна робота
Предмет:
Моделювання

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА” КАФЕДРА ЕЛЕКТРОННИХ ОБЧИСЛЮВАЛЬНИХ МАШИН Лабораторна робота №5 з курсу “Моделювання” на тему: “Аналіз генераторів випадкових чисел” Львів-2005 Мета роботи: Проаналізувати програмні генератори псевдовипадкових чисел. Теоретичні відомості: Традиційно програмне забезпечення використовує програмні генератори псевдовипадкових чисел. Принципова відмінність даних генераторів від апаратних полягає в тому, що такі генератори кожного разу генерують ідентичну послідовність. Використання програмних генераторів спричинило багато неправильних результатів в низці наукових робіт [1]. До недоліків таких генераторів слід віднести достатньо невеликий період повторення псевдовипадкової послідовності, наявність низькочастотних кореляцій у генерованій послідовності. Розглянемо декілька підходів до розробки таких генераторів. Використання рекурентних співвідношень вигляду:   або   де a, b, с, m – деякі цілі числа. Вибравши довільним чином деякі початкові значення для X, знаходимо кожне наступне число за співвідношеннями  або . У випадку використання конгруенції  всі генеровані числа належать до інтервалу . Саме такі співвідношення використовуються для реалізації функції rand() – стандартної функції бібліотеки мови С. Такі програмні генератори випадкових чисел мають низку недоліків. Вони формують випадкові числа таким чином, що лише їх молодші біти є більш-менш випадковими. Тому при генеруванні випадкових чисел в інтервалі  в жодному разі не можна використовувати співвідношення типу ,  оскільки генеровані таким чином випадкові числа характеризуватимуться іншими статистичними характеристиками. В даному випадку необхідно використовувати лише лінійне перетворення, наприклад:   Генератори випадкових чисел, побудовані на основі вищезгаданих співвідношень, характеризуються тим, що існують кореляції між згенерованими ними послідовностями. Зокрема, коли згенеровані таким чином послідовності k випадкових чисел відобразити у k-вимірному просторі, то відповідні точки не заповнюють весь простір, а лежатимуть на (k-1) вимірних площинах, причому таких площин буде не більше, ніж . Якщо крім того, коефіцієнти генератора ще й неправильно вибрано, то таких площин буде набагато менше, ніж  [1]. Виконання роботи: #include <dos.h> #include <math.h> #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <graphics.h> #define ESC 0x1b int GraphDriver; int GraphMode; int MaxX, MaxY; int ErrorCode; double buff1[100]; unsigned int buff2[100]; unsigned int buff3[100]; unsigned int buff4[100]; int kilk=0; FILE * fptr; void Initialize(void); void DrawGraphInt(char*, char*, int, unsigned int*); void DrawGraphDoubl(char*, char*, int, double*); void Pause(void); void MainWindow(char *header); void StatusLine(char *msg); void DrawBorder(void); void changetextstyle(int font, int direction, int charsize); int main() { clrscr (); if((fptr=fopen("c:\\rezult_lab5.txt", "w"))==NULL) { printf("\nNe mozhu vidkryty fajl"); exit(1); } buff1[0]=1; int a=0, b=0, i=0, m=0; printf ("----------Metod N1 (Xi+1=aXi+bint(aXi/b)) --------\n"); fprintf (fptr,"----------Metod N1 (Xi+1=aXi+bint(aXi/b)) --------\n"); printf ("Vvedit pochatkovi znachennya:\n"); printf ("a="); scanf ("%d", &a); printf ("b="); scanf ("%d", &b); printf ("kilkist="); scanf ("%d", &kilk); for (i=0; i<kilk; i++) { buff1[i+1]=a*buff1[i]+b*(a*buff1[i]/b); //Metod N1 fprintf (fptr, "%.1f ", buff1[i]); } fprintf (fptr, "\n"); Initialize(); DrawGraphDoubl("Lab5 / First method demonstration", "Xi+1=aXi+bint(aXi/b)", kilk, buff1[0]); printf ("---------- Metod N2 (Xj+1=(a*Xj) mod m) --------\n"); fprintf (fptr, "---------- Metod N2 (Xj+1=(a*Xj) mod m) --------\n"); printf ("Vvedit pochatkovi znachennya:\n"); printf ("a="); scanf ("%d", &a); printf ("m="); scanf ("%d", &m); printf ("kilkist="); scanf ("%d", &kilk); buff2[0]=13; for (i=0; i<kilk; i++) { buff2[i+1]=(a*buff2[i])%m; //Metod N2 fprintf (fptr, "%d ", buff2[i]); } fprintf (fptr, "\n"); Initialize(); DrawGraphInt("Lab5 / Second method demonstration", "Xj+1=(a*Xj) mod m", kilk, &buff2[0]); printf ("---------- Metod N3 (Y=x1+X mod (x2-x1+1)) --------\n"); fprintf (fptr, "---------- Metod N3 (Y=x1+X mod (x2-x1+1)) --------\n"); int x1, x2; printf ("Vvedit pochatkovi znachennya:\n"); printf ("X1="); scanf ("%d", &x1); printf ("X2="); scanf ("%d", &x2); printf ("kilkist="); scanf ("%d", &kilk); buff2[0]=13; for (i=0; i<kilk; i++) { buff3[i+1]=x1+(buff3[i]%(x2-x1+1)); //Metod N3 fprintf (fptr, "%d ", buff3[i]); } fprintf (fptr, "\n"); Initialize(); DrawGraphInt("Lab5 / Third method demonstration", "Y=x1+X mod (x2-x1+1)", kilk, &buff3[0]); printf ("---------- Metod N4 (Y=x1+((x2-x1)/(RAND_MAX+1))*X) --------\n"); fprintf (fptr, "---------- Metod N4 (Y=x1+((x2-x1)/(RAND_MAX+1))*X) --------\n"); int max=0; printf ("Vvedit pochatkovi znachennya:\n"); printf ("X1="); scanf ("%d", &x1); printf ("X2="); scanf ("%d", &x2); printf ("max="); scanf ("%d", &max); printf ("kilkist="); scanf ("%d", &kilk); buff2[0]=13; for (i=0; i<kilk; i++) { buff4[i+1]=x1+buff4[i]*(x2-x1)/(max+1); //Metod N4 fprintf (fptr, "%d ", buff4[i]); } fprintf (fptr, "\n"); Initialize(); DrawGraphInt("Lab5/Fourth method demonstration", "Y=x1+((x2-x1)/(RAND_MAX+1))*X", kilk, &buff4[0]); closegraph(); return(0); } /************************* FUNCTION ***********************************/ void Initialize(void) { GraphDriver = DETECT; initgraph( &GraphDriver, &GraphMode, "" ); ErrorCode = graphresult(); if( ErrorCode != grOk ) { printf(" Graphics System Error: %s\n", grapherrormsg( ErrorCode ) ); getch (); exit( 1 ); } MaxX = getmaxx(); MaxY = getmaxy(); } void DrawGraphInt(char *s1, char *s2, int k, unsigned int* buf) { int xstep, ystep; int sheight, swidth; int i, j, h; struct viewporttype vp; char buffer[40]; MainWindow(s1); h = 2 * textheight( "H" ); getviewsettings( &vp ); settextjustify( CENTER_TEXT, TOP_TEXT ); changetextstyle( TRIPLEX_FONT, HORIZ_DIR, 1 ); outtextxy( MaxX/2, 6, s2); changetextstyle( DEFAULT_FONT, HORIZ_DIR, 1 ); setviewport( vp.left+10, vp.top+10, vp.right-10, vp.bottom-10, 1 ); getviewsettings( &vp ); sheight = vp.bottom - vp.top; swidth = vp.right - vp.left; line( h, h, h, sheight-h ); line( h, sheight-h, sheight-h, sheight-h ); ystep = (sheight - (2*h) ) / 40; xstep = (swidth - (2*h) ) / k; j = sheight - h; settextjustify( CENTER_TEXT, CENTER_TEXT ); for( i=0 ; i<40 ; ++i ) { line( h/2, j, h, j ); itoa( i, buffer, 10 ); outtextxy( 7, j, buffer ); j -= ystep; } j = h; settextjustify( CENTER_TEXT, TOP_TEXT ); for( i=0; i<k; i++ ) { setfillstyle( 1, 1 ); line( j, sheight - h, j, sheight- 3 - (h/2) ); itoa( i, buffer, 10 ); outtextxy( j, sheight - (h/2), buffer ); if( buf[i]<=40 ) {bar( j, (sheight-h)-(buf[i] * ystep), j+xstep, sheight-h-1 ); rectangle( j, (sheight-h)-(buf[i] * ystep), j+xstep, sheight-h); } else { bar( j, 20, j+xstep, sheight-h-1 ); rectangle( j, 20, j+xstep, sheight-h); } j += xstep; } Pause(); } void DrawGraphDoubl(char *s1, char *s2, int k, double* buf) { int xstep, ystep; int sheight, swidth; int i, j, h; struct viewporttype vp; char buffer[40]; MainWindow(s1); h = 2 * textheight( "H" ); getviewsettings( &vp ); settextjustify( CENTER_TEXT, TOP_TEXT ); changetextstyle( TRIPLEX_FONT, HORIZ_DIR, 1 ); outtextxy( MaxX/2, 6, s2); changetextstyle( DEFAULT_FONT, HORIZ_DIR, 1 ); setviewport( vp.left+10, vp.top+10, vp.right-10, vp.bottom-10, 1 ); getviewsettings( &vp ); sheight = vp.bottom - vp.top; swidth = vp.right - vp.left; line( h, h, h, sheight-h ); line( h, sheight-h, sheight-h, sheight-h ); ystep = (sheight - (2*h) ) / 40; xstep = (swidth - (2*h) ) / k; j = sheight - h; settextjustify( CENTER_TEXT, CENTER_TEXT ); for( i=0 ; i<40 ; ++i ) { line( h/2, j, h, j ); itoa( i, buffer, 10 ); outtextxy( 7, j, buffer ); j -= ystep; } j = h; settextjustify( CENTER_TEXT, TOP_TEXT ); for( i=0; i<k; i++ ) { setfillstyle( 1, 1 ); line( j, sheight - h, j, sheight- 3 - (h/2) ); itoa( i, buffer, 10 ); outtextxy( j, sheight - (h/2), buffer ); if( buf[i]<=40 ) { bar( j, (sheight-h)-(buf[i] * ystep), j+xstep, sheight-h-1 ); rectangle( j, (sheight-h)-(buf[i] * ystep), j+xstep, sheight-h); } else { bar( j, 20, j+xstep, sheight-h-1 ); rectangle( j, 20, j+xstep, sheight-h); } j += xstep; } Pause(); } void Pause(void) { static char msg[] = "Esc aborts or press a key..."; int c; StatusLine( msg ); c = getch(); if( ESC == c ){ closegraph(); exit( 1 ); } if( 0 == c ){ c = getch(); } cleardevice(); } void MainWindow( char *header ) { int height; cleardevice(); setviewport( 0, 0, MaxX, MaxY, 1 ); height = textheight( "H" ); changetextstyle( DEFAULT_FONT, HORIZ_DIR, 1 ); settextjustify( CENTER_TEXT, TOP_TEXT ); outtextxy( MaxX/2, 2, header ); setviewport( 0, height+4, MaxX, MaxY-(height+4), 1 ); DrawBorder(); setviewport( 1, height+5, MaxX-1, MaxY-(height+5), 1 ); } void StatusLine( char *msg ) { int height; setviewport( 0, 0, MaxX, MaxY, 1 ); changetextstyle( DEFAULT_FONT, HORIZ_DIR, 1 ); settextjustify( CENTER_TEXT, TOP_TEXT ); setlinestyle( SOLID_LINE, 0, NORM_WIDTH ); setfillstyle( EMPTY_FILL, 0 ); height = textheight( "H" ); bar( 0, MaxY-(height+4), MaxX, MaxY ); rectangle( 0, MaxY-(height+4), MaxX, MaxY ); outtextxy( MaxX/2, MaxY-(height+2), msg ); setviewport( 1, height+5, MaxX-1, MaxY-(height+5), 1 ); } void DrawBorder(void) { struct viewporttype vp; setlinestyle( SOLID_LINE, 0, NORM_WIDTH ); getviewsettings( &vp ); rectangle( 0, 0, vp.right-vp.left, vp.bottom-vp.top ); } void changetextstyle(int font, int direction, int charsize) { int ErrorCode; graphresult(); settextstyle(font, direction, charsize); ErrorCode = graphresult(); if( ErrorCode != grOk ) { closegraph(); printf(" Graphics System Error: %s\n", grapherrormsg( ErrorCode ) ); exit( 1 ); } Результат роботи: ---------- Metod N1 (Xi+1=aXi+bint(aXi/b)) -------- 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 1073741824 2147483648 4294967296 8589934592 17179869184 34359738368 68719476736 137438953472 274877906944 549755813888 1099511627776 2199023255552 4398046511104 8796093022208 17592186044416 35184372088832 70368744177664 140737488355328 281474976710656 562949953421312 ---------- Metod N2 (Xj+1=(a*Xj) mod m) -------- 13 21 48 40 13 21 48 40 13 21 48 40 13 21 48 40 13 21 48 40 13 21 48 40 13 21 48 40 13 21 48 40 13 21 48 40 13 21 48 40 13 21 48 40 13 21 48 40 13 21 ---------- Metod N3 (Y=x1+X mod (x2-x1+1)) -------- 0 12 24 36 48 17 29 41 53 22 34 46 15 27 39 51 20 32 44 13 25 37 49 18 30 42 54 23 35 47 16 28 40 52 21 33 45 14 26 38 50 19 31 43 12 24 36 48 17 29 ---------- Metod N4 (Y=x1+((x2-x1)/(RAND_MAX+1))*X) -------- 0 11 16 19 20 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 Висновок: на цій лабораторній роботі я використовуючи засоби аналогового моделювання проаналізував поведінку програмних генераторів випадкових чисел.
Антиботан аватар за замовчуванням

13.02.2013 14:02-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!