ЛАБОРАТОРНАЯ РАБОТА 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. Написать собственную программу, использующую ДСЧ.
Оформление отчета.
Отчет должен содержать:
- математическую справку о равномерном распределении;
- текст своей программы с пояснениями.
-
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.