Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абстрактные классы.rtf
Скачиваний:
6
Добавлен:
10.07.2019
Размер:
2.25 Mб
Скачать

2.2.3. Класс случайных чисел

Для многих приложений требуются случайные данные, представляющие случайные события. Моделирование самолета, тестирующее реакцию летчика на непредвиденные изменения в поведении самолета, карточная игра, предполагающая, что сдающий использует тасованную колоду, и изучение сбыта, предполагающее вариации в прибытии клиентов, – все это примеры компьютерных приложений, которые опираются на случайные данные. Компьютер использует генератор случайных чисел (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