|
Программирование >> Структурное программирование
Чтобы показать, что эти числа имеют примерно одинаковую вероятность появления, давайте промоделируем с помощью программы, представленной на рис. 3.8, 6000 бросаний игральной кости. Каждое целое число от 1 до 6 должно появиться примерно 1000 раз. Как показывает результат работы этой программы, с помощью функции rand и с применением масштабирования и сдвига мы действительно промоделировать бросание шестигранной игральной кости. Заметим, что в структуре switch не предусмотрен раздел default. После того как мы изучим массивы в главе 4, мы покажем, как можно изящно заменить всю структуру switch всего одним однострочным оператором. Повторное выполнение программы на рис. 3.7 приводит к результату: 5 5 3 5 5 2 4 2 5 5 5 3 2 2 1 5 14 6 4 Заметьте, что печатается точно та же последовательность чисел, которая уже была раньше. Какие же это сл5айные числа? Как ни смешно, эта повторяемость является важной характеристикой функции rand. При отладке программы такая повторяемость имеет важное значение для доказательства того, что программа работает должным образом. Функция rand на самом деле генерирует псевдослучайные числа. Повторный вызов rand производит последовательность чисел, которые кажутся случайными. Но та же самая последовательность повторяется при каждом повторении программы. Когда программа тщательно отлажена, она может быть использована для получения разных последовательностей случайных чисел при каждом выполнении. Это называется рандомизацией и реализуется в законченном виде с помощью стандартной библиотечной функции srand. Функция srand получает целый аргумент unsigned и при каждом выполнении программы задает начальное число, которое функция rand использует для генерации последовательности квазислучайных чисел. Использование srand демонстрируется программой, приведенной на рис. 3.9. В программе использован тип данных unsigned, что является краткой записью unsigned int. Число типа int занимает при хранении по меньшей мере два байта памяти и может иметь как положительное, так и отрицательное значение. Переменная типа unsigned int также хранится по меньшей мере в двух байтах памяти. Двухбайтовая unsigned int может иметь только положительные значения в диапазоне от О до 65535. Четырехбайтовая unsigned int может иметь только положительные значения в диапазоне от О до 4294967295. Функция srand получает значение unsigned int в качестве аргумента. Прототип функции srand находится в заголовочном файле <stdlib.h>. Прогоните программу несколько раз и понаблюдайте результаты. Заметьте, что при прогоне программы с разными начальными значениями каждый раз получаются разные последовательности случайных чисел. #include <iomanip.h> #include <stdlib.h> main() { int frequencyl = 0, frequency2 = 0, frequencyS = 0, frequency4 = 0, frequencyS = 0, frequency6 = 0; for (int roll = 1; roll <= 6000; roll++) { s/ji, int face = 1 + rand () % 6; switch (face) { case 1: ++frequencyl; Ъхеак; case 2: ++frequency2; -.-i, break; r- case 3 : ++frequency3; break; case 4 : ++frequency4; break; case 5: H ++frequencyS; Щ break; case 6: Щ ++frequency6; break; cout Грань setw(13) Частота endl 1 setw(13) frequencyl endl 2 setw (13) frequency2 endl 3 setw(13) frequencyS endl 4 setw(13) frequency4 << endl 5 setw(13) frequencyS endl 6 setw(13) frequency6 endl, return 0; Грань Частота 1 987 2 984 . , 3 1029 4 974 5 1004 6 1022 Рис. 3.8. Бросание шестигранной игральной кости 6000 раз Бросание шестигранной игральной кости 6000 раз include <iostream.h> y:-. Введите число: 67 16 5 14 5 6 3 1 2 Введите число: 432 4 2 6 4 3 2 5 14 4 Введите число: 67 16 5 14 5 6 3 1 2 Рис. 3.9. Программа рандомизации бросания игральной кости Если мы хотим рандомизировать не вводя каждый раз начальное число, можно использовать оператор, подобный следующему srand(time(NULL)) ; При этом для автоматического получения начального числа компьютер считывает показания своих часов. Функция time (с аргументом NULL, как записано в указанном выше операторе) возвращает текущее календарное время в секундах. Это значение преобразуется в беззнаковое целое число и используется как начальное значение в генераторе случайных чисел. Прототип функции для time находится в <time.h>. Значение, генерируемое функцией rand, всегда находится в диапазоне: о < rand о < RAND MAX Выше мы показали, что смоделировать бросание шестигранной игральной кости можно с помощью всего одного оператора: face = 1 + rand О % 6; Программа рандомизации бросания игральной кости #include <iostream.h> : #include <iomanip.h> #include <stdlib.h> main() ЩШ { unsigned seed; cout << Введите число: ; cin >> seed; srand(seed) ; for (int i = 1; i <= 10; i++) ( cout setw(lO) 1 + randO % 6; if (i % 5 == 0) cout endl; H return 0;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |