192 Глава 3
Чтобы показать, что эти числа имеют примерно одинаковую вероятность появления, давайте промоделируем с помощью программы, представленной на рис. 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 1 4 6 4
Заметьте, что печатается точно та же последовательность чисел, которая уже была раньше. Какие же это случайные числа? Как ни смешно, эта повторяемость является важной характеристикой функции rand. При отладке программы такая повторяемость имеет важное значение для доказательства того, что программа работает должным образом.
Функция rand на самом деле генерирует псевдослучайные числа. Повторный вызов rand производит последовательность чисел, которые кажутся случайными. Но та же самая последовательность повторяется при каждом повторении программы. Когда программа тщательно отлажена, она может быть использована для получения разных последовательностей случайных чисел при каждом выполнении.
Это называется рандомизацией и реализуется в законченном виде с помощью стандартной библиотечной функции srand. Функция srand получает целый аргумент unsigned и при каждом выполнении программы задает начальное число, которое функция rand использует для генерации последовательности квазислучайных чисел.
Использование srand демонстрируется программой, приведенной на рис. 3.9. В программе использован тип данных unsigned, что является краткой записью unsigned int. Число типа int занимает при хранении по меньшей мере два байта памяти и может иметь как положительное, так и отрицательное значение. Переменная типа unsigned int также хранится по меньшей мере в двух байтах памяти. Двухбайтовая unsigned int может иметь только положительные значения в диапазоне от 0 до 65535. Четырехбайтовая unsigned int может иметь только положительные значения в диапазоне от 0 до 4294967295. Функция srand получает значение unsigned int в качестве аргумента. Прототип функции srand находится в заголовочном файле <stdIib.h>.
Прогоните программу несколько раз и понаблюдайте результаты. Заметьте, что при прогоне программы с разными начальными значениями каждый раз получаются разные последовательности случайных чисел.
Функции
193
// Бросание шестигранной игральной кости 6000 раз #include <iostream.h> #include <iomanip.h> #include <stdlib.h>
main ( )
int
frequencyl = 0, frequency2 = 0, frequency3 = 0, frequency4 = 0, frequency5 = 0, frequency6 = 0;
for (int roll = 1; roll <= 6000; roll++J { int face = 1 + rand() % 6;
switch (face) { case 1:
++frequencyl ;
break; case 2:
++frequency2 ;
break; case 3 :
++frequency3 ;
break; case 4 :
++frequency4;
break; case 5:
++frequency5;
break; case 6:
++frequency6;
break;
cout « "Грань" « setw(13) « "Частота"
« endl «
« endl «
« endl «
« endl «
« endl «
« endl «
1" « setw(13) « frequencyl
2" « setw(13) « frequency2
3" « setw(13) « frequency3
4" « setw(13) « frequency4
5" « setw(13) « frequency5
6" « setw(13) « frequency6 « endl;
return 0;
Грань | Частота |
1 | 987 |
2 | 984 |
3 | 1029 |
4 | 974 |
5 | 1004 |
6 | 1022 |
Рис. 3.8. Бросание шестигранной игральной кости 6000 раз
- 116 Глава 2
- 2.13. Основы повторения, управляемого счетчиком
- 2.14. Структура повторения for (цикл)
- 120 Глава 2
- 122 Глава 2
- 2.15. Пример использования структуры for
- 124 Глава 2
- 126 Глава 2
- 2.16. Структура множественного выбора switch
- Глава 2
- 130 Глава 2
- 132 Глава 2
- 2.17. Структура повторения do/while
- 134 Глава 2
- 2.18. Операторы break и continue
- Глава 2
- 2.19. Логические операции
- 138 Глава 2
- Глава 2
- 2.21. Заключение по структурному программированию
- IfcrpyKTypa (единственный выбор)
- Глава 2
- Глава 2
- 148 Глава 2
- Глава 2
- Глава 2
- Глава 2
- 156 Глава 2
- 158 Глава 2
- 160 Глава 2
- 2.1. А) следование, выбор и повторение, b) if/else. С) управляемым счет чиком или определенным заранее, d) Метку, сигнал, флаг или лож ный сигнал.
- 162 Глава 2
- 164 Глава 2
- 166 Глава 2
- 168 Глава 2
- 170 Глава 2
- 172 Глава 2
- 174 Глава 2
- 176 Глава 2
- 178 Глава 3
- Глава 3
- 3.3. Математические библиотечные функции
- 3.4. Функции
- Глава 3
- 3.5 Определения функций
- 184 Глава 3
- 186 ГлаваЗ
- 3.6. Прототипы функций
- 188 Глава 3
- 3.7. Заголовочные файлы
- 3.8. Генерация случайных чисел
- Глава 3
- 192 Глава 3
- 194 Глава 3
- 3.9. Пример: азартная игра
- Глава 3
- 198 Глава 3
- 3.10. Классы памяти
- 200 Глава 3
- 3.11. Правила, определяющие область действия
- 202 Глава 3
- 204 Глава 3
- 3.12 Рекурсия
- Глава 3
- 6) Значения, возвращаемые после каждого рекурсивного вызова
- 3.13. Пример использования рекурсии: последовательность чисел Фибоначчи
- Глава 3
- 3.14. Рекурсии или итерации
- 212 Глава 3
- Глава 3
- Глава 4
- Глава 5
- Глава 6
- 3.15. Функции с пустыми списками параметров
- 214 Глава 3
- 3.16. Встраиваемые функции