Генератор случайных чисел. Знакомство с библиотечной программой генерации случайных чисел и простейшими ее применениями

Страницы работы

Содержание работы

ЛАБОРАТОРНАЯ РАБОТА N 4

 Генератор случайных чисел

1.Цель и задачи.

Знакомство с библиотечной программой генерации случайных чисел и простейшими ее применениями.

2.Теоретические сведения.

В библиотеке С  stdlib (# include  <stdlib.h>) имеется функция   rand(). При вызове она возвращает целое число в пределах от 1 до 32767. Последнее число зависит от конкретной реализации языка С и хранится в той же библиотеке как константа с именем RAND_MAX. Функция  rand() имитирует следующий механизм случайности: представим себе рулетку, круг которой разбит на 32767 секторов;

при каждом обращении к  rand() рулетка запускается и возвращается номер сектора, против которого остановился указатель.

Убедитесь в этом, выполнив программу 1.

Программа 1

# include  <stdio.h>

# include <stdlib.h>

# include <conio.h>

main()

{

  int i;

  randomize();

  clrscr();

  printf("\n\t\t 80 значенийфункции rand()\n\n");

  for(i=0; i<80; i++)  printf("%d\t", rand())

      getch();

    }

Как будет видно далее, удобнее использовать в качестве базового датчика случайных чисел программу, имитирующую случайную величину  U,

равномерно распределенную на отрезке [0,1]. Ее легко получить как  uni()=rand() / RAND_MAX.. Эту программу будем называть

датчик случайных чисел  (ДСЧ).


Программа 2

# include  <stdio.h>

# include <stdlib.h>

# include <conio.h>

double uni()

{

  double dr=rand();

  return dr/RAND_MAX;

}

main()

{

  int i;

  randomize();

  clrscr();

  printf("\n\t\t 80 значенийДСЧ\n\n");

  for(i=0; i<80; i++)  printf("%6.4f\t",uni())

      getch();

    }

При многократном обращении к ДСЧ получается последовательность точек, равномерно рассеянная по отрезку [0,1], без сгущений или разрежений.

Если точки надо рассеять на отрезке  [a,b], то это легко сделать при помощи преобразования   a+(b-a)*uni()..

Чтобы наглядно убедиться в указанной равномерности выведем на экран компьютера

1000 точек со случайными координатами.


Программа 3

# include <stdio.h>

# include <stdlib.h>

# include <conio.h>

# include <math.h>

# include <graphics.h>

/* датчик случайных чисел */

double uni()

{

  double dr=rand();

  return dr/RAND_MAX;

}

main()

{

int i,j,n=1000,a,b;

int gdriver=DETECT,gmode,x,y,maxx,maxy,pole=40;

randomize();

/* установка графического режима*/ 

initgraph(&gdriver.&gmode,””};

maxx=getmaxx(); maxy=getmaxy();

a=maxx-2*pole; b=maxy-2*pole;

/* рамка*/ 

moveto(pole,pole); lineto(pole,maxy-pole);

lineto(maxx-pole,maxy-pole);lineto(maxx-pole,pole);

/* посев случайных точек */      

for(i=0; i<n; i++){

    x=pole+a*uni();y=pole+b*uni();

    putpixel(x,y,15);

}

    getch();

    closegraph();

}

Отметим еще роль функции   randomize(), используемой в приведенных выше программах. Функция  rand() вырабатывает случайные числа по жесткому алгоритму, вычисляя очередное число путем некоторых преобразований предыдущего. Поэтому при одном и том же первом случайном числе и вся вырабатываемая последовательность будет одной и той же.

Функция  randomize() определяет случайным образом первое число на основе показания компьютерных часов.


Задание.

1. Исполнить программы 1 и 2.

2. "Поиграться" с программой 3, изменяя размеры рамки, количество случайных точек, их вид и т.п. Заменив putpixel(x,y,15) на lineto(x,y) , построить случайную ломаную.

3. Написать собственную программу, использующую ДСЧ.

Оформление отчета.

Отчет должен содержать:

- математическую справку о равномерном распределении;

-  текст своей программы с пояснениями.    

-   

Похожие материалы

Информация о работе

Предмет:
Информатика
Тип:
Отчеты по лабораторным работам
Размер файла:
31 Kb
Скачали:
0