Подготовка входных данных ОСНОВЫ ПРОГРАММИРОВАНИЯ Преподаватель: Доцент Кафедры ВС, к.т.н.

advertisement
ФГОБУ ВПО "СибГУТИ"
Кафедра вычислительных систем
ОСНОВЫ ПРОГРАММИРОВАНИЯ
Подготовка входных данных
Преподаватель:
Доцент Кафедры ВС, к.т.н.
Поляков Артем Юрьевич
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
Псевдослучайные числа в языке СИ
В стандартной библиотеке языка Си предусмотрены две функции генерации
случайных чисел: rand() и random(). Обе функции объявлены в файле stdlib.h:
int rand(void);
long int random(void);
Случайные числа генерируются в диапазоне от 0 до RAND_MAX, где
RAND_MAX – константа, определенная в заголовочном файле stdlib.h. Для
определения значения константы RAND_MAX можно выполнить ее печать на
экран:
printf("RAND_MAX = %d\n", RAND_MAX);
В общем случае функция random() генерирует более качественные
случайные числа. Младшие биты случайных чисел, генерируемых функцией
rand() будут в меньшей степени случайными по сравнению со старшими. Для
функции random() гарантируется, что как старшие, так и младшие биты
формируемых чисел в одинаковой степени будут случайными.
В GNU LibC обе функции реализованы идентично.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
2
Задание №1. Генерация случайных чисел
Выполните реализацию приведенных ниже программ. prog1 выполняет
генерацию случайных чисел с использованием функции rand(), а prog2 random(). Выполните их 3 раза и сравните результаты выполнения между собой.
#include <stdio.h>
#include <stdlib.h>
prog1
int main()
{
int rval, i, n;
printf("Input number of random values: ");
printf("sizeof(int)=%ld, RAND_MAX=%d\n",
sizeof(int),RAND_MAX);
scanf("%d",&n);
for(i=0;i<n;i++){
rval = rand();
printf("%d ",rval);
if( (i + 1) % 10 == 0 )
printf("\n");
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
prog2
int main()
{
long int rval;
int i, n;
printf("Input number ov random values: ");
printf("sizeof(long int)=%ld RAND_MAX=%d\n",
sizeof(long int), RAND_MAX);
scanf("%d",&n);
for(i=0;i<n;i++){
rval = random();
printf("%ld ",rval);
if( (i+1)%10 == 0)
printf("\n");
}
return 0;
}
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
3
Случайное зерно
Вычислительная техника является детерминированной, т.е. не обладает
никакими элементами случайности. Числа, формируемые генераторами
псевдослучайных чисел будут "случайными" относительно друг друга, но будут
всегда одинаковыми относительно запусков программы. [Данное свойство
эффективно используется при отладке программ].
Такое поведение связано с тем, что генераторы псевдослучайных чисел
вычисляют следующее число, используя предыдущее.
Для того, чтобы при каждом запуске программы случайные числа были
различными необходимо по-разному инициализировать генератор. Для
инициализации генератора в стандартной библиотеке предусмотрены функции :
void srand(unsigned int seed); // для rand()
void srandom(unsigned int seed); // для random()
Параметр seed (англ. зерно) инициализирует генератора случайных чисел. В
качестве него обычно используют текущее время. которое можно получить при
помощи функции time(NULL).
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
4
Задание №2. Генерация различных наборов
случайных чисел
1. На основе prog1 выполните реализацию prog1_s. В новой программе перед
генерацией случайных чисел должен выполняться вызов функции srand(), при
этом необходимо обеспечить возможность ввода значения seed с клавиатуры
(аналогично параметру n).
2. Выполните 3 запуска модифицированной программы со значениями
seed=1, 1024, 1245678910. Сравните результаты prog1 и prog1_s.
3. На основе программы prog1_s разработайте программу prog1_st, в которой
для инициализации генератора случайных чисел будет использоваться текущее
время, которое можно получить с использованием функции time() следующим
образом:
srand(time(NULL));
Сравните результаты prog1, prog1_s и prog1_st.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
5
Алгоритм поиска с барьером в упорядоченной
последовательности (средний случай) (2)
Рассмотрим 3 частных случая распределения элементов последовательности a
по диапазону допустимых значений R
1. Точки сосредоточены в начале диапазона R
a1 a2
an
...
R
В рамках практического занятия "Алгоритмы сортировки" был
рассмотрен только случай №2, R / (n+1) = 100
2. Точки равномерно распределены по диапазону R
R / (n+1)
a1
an
a2
...
3. Точки сосредоточены в конце диапазона R
a1 a 2
an
...
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
6
Задание №3. Формирование входных данных класса 1.
Разработать программу beginrange_gen, генерирующую возрастающую
последовательность a длины n. Элементы последовательности располагаются в
начале диапазона R = 100∙n. Расстояние между элементами последовательности
≤ 10. Например, при n = 4, R = 100∙n = 400 может быть сформирована
следующая последовательность:
5 1517 25
1
400
Расстояние между соседними точками формируется случайным образом с
использованием функции random().
Для того, чтобы изменить диапазон значений генерируемых случайных
чисел с [0, RAND_MAX] на [1, 10] использовать выражение "(r mod 10) + 1", где
r – псевдослучайное, сгенерированное функцией random().
Выходные данные: файл, следующего формата:
n R\n
a1 a2 a3 a4 … an\n
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
7
Задание №4. Формирование входных данных класса 3.
Разработать программу endrange_gen, генерирующую возрастающую
последовательность длины n. Элементы последовательности располагаются в
конце диапазона R = 100∙n. Расстояние между элементами последовательности
≤ 10. Например, при n = 4, R = 100∙n = 400 может быть сформирована
следующая последовательность:
285 391
1
280 288
400
Расстояние между соседними точками формируется случайным образом с
использованием функции random().
Для того, чтобы изменить диапазон значений генерируемых случайных
чисел с [0, RAND_MAX] на [1, 10] использовать выражение "(r mod 10) + 1", где
r – псевдослучайное, сгенерированное функцией random().
Выходные данные аналогично заданию 3.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
8
Задание №5. Формирование входных данных класса 2.
В рамках практической работы "Алгоритмы сортировки" рассматривались
только последовательности, в которых числа шли с одинаковым шагом
R / (n+1) = 100, следовательно, R = 100∙n. На практике входные данные,
соответствующие классу 2 не будут так равномерно распределены.
R / (n+1)
a1
an
a2
...
Разработать программу unirange_gen генерации входных данных,
соответствующие классу 2. На вход программы поступает количество чисел n и
среднее расстояние d между точками. Значение R принимается равным n∙d.
Расстояние между соседними точками формируется случайным образом с
использованием функции random(). Для того, чтобы изменить диапазон
значений генерируемых случайных чисел с [0, RAND_MAX] на [1, 10]
использовать выражение "(r mod 10) + 1", где r – псевдослучайное,
сгенерированное функцией random().
Выходные данные аналогично заданию 3.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
9
Генерация случайных последовательностей
В рассмотренных ранее задачах последовательности формировались с
использованием случайных чисел, однако обладали заранее известнывми
свойствами: были упорядочены. Генерация случайных последовательностей, в
которых числа не повторяются и располагаются в произвольном порядке
является более сложной.
При использовании функции random() расстояние между случайными
числами с одинаковым значением заранее неизвестно. Поэтому требование
уникальности (отсутствия повторений) не позволяет использовать
генерируемую последовательность случайных в чистом виде.
В рамках данной практической работы будет рассмотрен один из
возможных подходов к решению данной проблемы, который предусматривает
перемешивание упорядоченной последовательности с целью нарушения
порядка следования ее элементов.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
10
Перемешивание последовательности
Пусть мы располагаем упорядоченной последовательностью a размера n и
генератором случайных чисел RND() в диапазоне [0, M]:
1
2
3
4
5
6
7
8
9
10
11
12
1
2
7
10
12
21
24
29
35
46
54
70
Используя генератор RND() случайным образом сформируем
допустимых индекса в данной последовательности:
i = (RND() mod 10) + 1, j = (RND() mod 10) + 1
Пусть i = 6, а j = 11. Обменяем местами a[i] и a[j]
1
2
3
4
5
6
7
8
9
10
11
12
1
2
7
10
12
54
24
29
35
46
21
70
два
Процедура повторяется не менее n / 2 раз. После упорядоченность
последовательности a будет нарушена и последовательность можно
рассматривать как случайную, однако состоящую из заданного набора чисел.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
11
Задание №6. Формирование неупорядоченных входных данных.
Разработать программу random_gen формирования неупорядоченных
входных данных для алгоритмов сортировки. За основу взять программу,
разработанную в задании 5.
Сначала, используя алгоритм исходной программы, генерируется набор
случайных значений последовательности. Однако эта последовательность не
выводится в файл, а размещается во вспомогательном массиве размера n. Для
создания данного массива желательно использовать динамическое выделение
памяти (см. демонстрационную программу последовательного поиска из
практического занятия "Алгоритмы сортировки", функция malloc и free).
Далее полученный массив перемешивается согласно алгоритму,
рассмотренному на предыдущем слайде.
После этого результат выводится в файл согласно принятому формату.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
12
Дополнительные исследования к занятию
"Алгоритмы сортировки"
1. Проверить теоретические оценки вычислительной сложности всех
рассмотренных алгоритмов сортировки для класса 1 и 3 входных данных.
Данные подготовить с помощью разработанных программ beginrange_gen и
endrange_gen.
2. С помощью программы unirange_gen проверить, сохраняются ли
полученные ранее соотношения в том случае, когда элементы
последовательности распределены не с равным шагом 100, а случайным
образом. При этом считать, что расстояние между элементами не превышает 50.
3. Используя программу random_gen подготовить входные данные
размером 25, 26, 27, 28, 29, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220. Построить
график, показывающий зависимость среднего времени внутреннего поиска от
размера входной последовательности.
По полученной информации подготовить приложение к отчету по практике
"Алгоритмы поиска", в котором описать только полученные результаты.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
13
Download