В большинстве случаев при имитационном моделировании используют программные методы получения случайных чисел. Такие числа уже нельзя назвать «случайными», но они обладают многими статистическими свойствами строго случайных чисел. В литературе они получили название «псевдослучайных» чисел. В настоящее время большинство программ, генерирующих псевдослучайные числа, используют конгруэнтную процедуру, при которой каждое последующее число хм получается из предыдущего xi. В основе конгруэнтных процедур генерирования псевдослучайных чисел лежит математическое понятие сравнения (congruence). Целые числа а и b считаются сравнимыми по модулю т, если эти числа дают одинаковые остатки при делении на m (или, что то же самое, разность этих чисел делится на m без остатка). Математически процедуру сравнения записывают следующим образом: а = b (mod m) и читают «а, сравнимое с b по модулю m».
Искомая последовательность псевдослучайных чисел получается из соотношения: xi+1≡ (a xi+ b)(mod m).
Из этого выражения следует, что количество различных псевдослучайных чисел не может быть больше т. После генерации т чисел последующие числа начинают повторяться. При неудачном выборе величин а и b период может быть меньше т. Существуют теоретические предпосылки, позволяющие осуществить выбор чисел a, b и т. В частном случае b = 0, т.е.
|
|
Xi+1 = ахi (mod m). Такой генератор называют мультипликативным, и он дает достаточно хорошие результаты (полученные числа имеют хорошие статистические характеристики).
Количество различных псевдослучайных чисел зависит от разрядности процессора, так как обычно модуль т принимают равным 2k-1, где k - разрядность процессора.
Для удобства пользования псевдослучайными числами во всех ЭВМ имеется программа, дающая равномерное распределение в пределах 1 < х < 0. В языках программирования обращение к генератору случайных чисел осуществляется специализированными операторами, например RND [(*)]. В языке Turbo-Basic, если х = 0, to повторяется последнее генерированное число, если х < 0, то генерируется новая последовательность случайных чисел, если х > 0 или х отсутствует, то генерируется очередное случайное число, но при повторном запуске последовательность повторяется.
В других языках программирования существуют аналогичные правила и операторы.
Если необходимы случайные числа с другими распределениями вероятностей, то после обращения к генератору, дающему случайные числа R в интервале (0,1), используют простые преобразования [3].
Из теории вероятностей известно, что равномерное распределение в интервале (А, В) получается преобразованием X=A+(B-A)*R. Математическое ожидание в этом случае будет
|
|
ЕХ =(B+A)/2, а дисперсия VX=(B-A)2/2.
Для получения нормального распределения с нулевым средним производится суммирование 12 случайных чисел R. Из суммы вычитается 6, а результат умножается на величину заданного среднеквадратического значения, так как дисперсия суммы равна единице,
т.е.
Если среднее значение отличается от нуля, то к этому выражению добавляется величина, равная среднему значению.
Для получения экспоненциального распределения Р(х)=α e -α x , α > 0, х ≥ 0, производится операция х = -(l/α)log(R). При этом математическое ожидание ЕХ=1/α и дисперсия VX = 1/α2 = ЕХ2.