logo
Харви Дейтел, Пол Дейтел Как программировать на С++ / 02-Deitel-Стр-115-214

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. Четырехбайтовая un­signed 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 раз