
- •1. Пользовательский тип — класс
- •Объявление класса
- •Пример 1.
- •Конструктор
- •Объявление объекта
- •Реализация класса
- •Реализация конструктора
- •Создание объектов
- •Пример 2.
- •2. Примеры классов
- •Класс Temperature
- •Реализация класса Temperature
- •Класс случайных чисел
- •Пример 3.
- •Реализация класса RandomNumber
- •3. Объекты и передача информации
- •Объект как возвращаемое значение
- •Объект как параметр функции
- •4. Массивы объектов
- •Конструктор умолчания
- •5. Множественные конструкторы
- •Реализация класса Date
- •6. Практическое применение: Треугольные матрицы
- •Свойства верхней треугольной матрицы
- •Хранение треугольной матрицы
- •Пример 4.
- •Пример 5.
- •Класс TriMat
- •Реализация класса TriMat
Класс случайных чисел
Для многих приложений требуются случайные данные, представляющие случайные события. Моделирование самолета, тестирующее реакцию летчика на непредвиденные изменения в поведении самолета, карточная игра, предполагающая, что сдающий использует тасованную колоду, и изучение сбыта, предполагающее вариации в прибытии клиентов, – все это примеры компьютерных приложений, которые опираются на случайные данные. Компьютер использует генератор случайных чисел (random number generator), который выдает числа в фиксированном диапазоне таким образом, что числа равномерно распределяются в этом диапазоне. Генератор использует детерминистический алгоритм, который начинается с начального значения данных, называемого значением, инициализирующим алгоритм, или seed-значением. Алгоритм манипулирует этим значением для генерирования последовательности чисел. Этот процесс является детерминистическим, так как он берет начальное значение и выполняет фиксированный набор инструкций. Выход является уникальным, определенным данными и инструкциями. По существу, компьютер не производит истинные случайные числа, а создает последовательности псевдослучайных чисел (pseudorandom numbers), которые распределяются равномерно в диапазоне. Вследствие начальной зависимости от seed-значения, генератор создает ту же последовательность при использовании одного и того же seed-значения. Способность повторять случайную последовательность используется в исследованиях моделирования, где в приложении необходимо сравнить различные стратегии, реагирующие на один и тот же набор случайных условий. Например, имитатор полета использует одну и ту же последовательность случайных чисел для сравнения эффективности реакции двух летчиков на аварию самолета. Каждый летчик подвергается одному и тому же набору событий. Однако, если seed-значение изменяется каждый раз при запуске имитатора, мы имеем уникальное моделирование. Эта уникальность свойственна игре, которая обычно создает различную последовательность событий каждый раз в процессе игры.
Большинство компиляторов предоставляют библиотечные функции, реализующие генератор псевдослучайных чисел, К сожалению, вариация этой реализации в зависимости от компилятора является значительной. Для предоставления генератора случайных чисел, переносимого из системы в систему, мы создаем класс RandomNumber, Этот класс содержит seed-значение, которое должно инициализироваться клиентом. В соответствии с начальным seed-значением генератор создает псевдослучайную последовательность. Класс обеспечивает автоматический выбор seed-значения, когда конструктору не передается никакого значения, и позволяет клиенту создавать независимые псевдослучайные последовательности.
Спецификация класса RandomNumber
ОБЪЯВЛЕНИЕ
#include <time.h>
// используется для генерации случайного числа
//по текущему seed-значению
const unsigned long maxshort = 65536L;
const unsigned long multiplier = 1194211693L;
const unsigned long adder = 12345L;
class RandomNumber
private:
// закрытый член класса, содержащий текущее seed-значение
unsigned long randSeed;
public:
//конструктор, параметр 0 задает автоматический
// выбор seed-значения
RandomNumber(unsigned long s = 0);
// генерировать случайное целое в диапазоне [0, n-1]
unsigned short Random(unsigned long n);
// генерировать действительное число в диапазоне [0, 1.0]
double fRandom(void);
};
ОПИСАНИЕ
Начальное seed-значение – это беззнаковое длинное число. Метод Random принимает беззнаковый длинный параметр n <= 65536 и возвращает 16-битовое беззнаковое короткое значение в диапазоне 0,..., n–1. Заметьте, что если возвращаемое методом Random значение присваивается целой переменной со знаком, то это значение может интерпретироваться как отрицательное, если n не будет удовлетворять неравенству n<215=32768. Функция fRandom возвращает число с плавающей точкой в диапазоне 0 < fRandom() < 1.0.
ПРИМЕР
RandomNumber rnd; // seed-значение выбирается автоматически
RandomNumber R(1); // создает последовательность с
// seed пользователя 1
cout << R.fRandom(); // выводит действительное число
// в диапазоне 0—1
//выводит 5 случайных целых чисел в диапазоне 0—99
for (int i = 0; i < 5; i++)
cout << R.Random(100) << " "; // <sample> 93 21 45 5 3