Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Симула.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
393.73 Кб
Скачать

1 12.1. Последовательности псевдослучайных чисел

Все.процедуры случайной выборки в языке СИМУЛА-67 используют один и тот же прием получения «главной вы­ борки» из равномерного распределения на интервале (0,1). :■ Процедура главной выборки заменяет значение указанной целой переменной, скажем £/, новым значением в соответ­ ствии с некоторым алгоритмом, определяемым в данной реа­ лизации языка. Например, для двоичных машин удобен сле­ дующий алгоритм: ■ ■

иш = остаток (

где Ui есть i-e значение переменной U. Можно показать, что если f/o — положительное нечетное число, то такими же бу­дут и все Ui и последовательность £/0/ U\y U% ..., периоди­ческая с периодом 2п~2. (Младшие два бита значений U остаются неизменными, тогда ка-к прочие пробегают все воз­можные комбинации.) • . .

Вещественные числа щ = Ui X 2~п принадлежат интер­валу (0,1). Последовательность щ, и2, ... называется после­довательностью псевдослучайных чисел и щ (/=='1, 2, ,..)

является i-й результатом главной выборки из последователь­ности U. Последовательность однозначно определяется на­чальным значением i/o» соответствующей целой переменной. Тем не менее она является «хорошим приближением» к на­стоящей последовательности случайных чисел.

12.2, ПРОЦЕДУРЫ СЛУЧАЙНОГО ВЫБОРА

Каждая из перечисленных далее процедур осуществляет случайный выбор того или иного рода. Если явно не указано противного, выбор выполняется посредством одной проце­дуры ^главной выборки, т. е. процедуры с побочным эффектом продвижения на один шаг по указанной последовательности псевдослучайных чисел. Для формальных параметров про­цедур случайного выбора в случае необходимости выпол­няется преобразование типа фактических параметров, кроме последнего фактического параметра, которым всегда должна быть 'переменная типа integer, указывающая последователь­ность псевдослучайных чисел.

-Г I

1.'Boolean procedure draw (a, U)\ name U\ real a\ integer U\

Доставляет значение true с вероятностью а и значение false с вероятностью 1 — а. При а ^ 1 всегда доставляет значение true, а при а^О всегда доставляет значение false.

b

2. integer procedure randint (a, b9 U)\ name U\ integer a, b, U;

Доставляет с равной вероятностью одно из целых значе­ний: а, а + 1, ..., b — 1, b. Предполагается, что b^-а; при b < а выдается сообщение об ошибке.

3. real procedure uniform {a, b, U); name U; real a, b; integer U\ , -

. 'Доставляет значение, равномерно распределенное по по­лусегменту [а, 6). При b < а выдается сообщение об ошибке.

4. real procedure normal (a, b% U); name U; real a, b \ integer U;

Доставляет значение, распределенное по нормальному за­кону со средним а и стандартным отклонением Ь. Приме­няется аппроксимационная формула для нормальной функ­ции распределения !).

' ) См. Abramowitz M., Stegun I. A. (ed), Handbook of Mathe­matical Functions, National Bureau of Standard. Applied Mathematics Se­ries, Ns 55, стр. 952 и формула (26.2.23) на стр. 933.

5. real procedure negexp (a, U); name U; real a; integer [/; r

Доставляет значение, распределенное по экспоненциаль­ному закону со средним Ца. Эго значение определяется по формуле —In (и) /а, где и получается процедурой главной вы­борки. Это совпадает с временем ожидания события при пуассоновском распределении числа наступлений события, если их среднее число в единицу времени равно а,

6. integer procedure Poisson (at U); name U; real a; integer U\

Доставляет значение, распределенное по закону Пуас­сона с параметром а. Это значение получается в результате (п + 1)-кратной главной выборки, доставляющей значения uo,ui7 ..., иП9 где п определяется как наименьшее неотрица­тельное целое, для которого

п

0

/

Это п и является значением процедуры. Справедливость ис пользуемой формулы следует из эквивалентности ее с

п

где в левой части стоит сумма «времен ожидания», распреде­ленных по экспоненциальному закону. Если параметр больше, чем некоторая определенная при реализации граница, напри­мер больше чем 20.0, то искомое значение может быть аппро­ксимировано выражением entier (normal (a, sqrt (a), U) + + 0.5) или нулем, если получается- отрицательное значение.

7. real procedure Erlang (a, b, U)\ name U\ integer U; real a, b ;

Доставляет значение, распределенное по закону Эрланга

со'средним 1/а и стандартным отклонением l/(a yb)- Это значение определяется при целом Ь в виде суммы

ь

S

" \ (здесь щ — значения главной выборки),

а при нецелом 6 —в виде

1и(«|)

aXb aXb *

где с — entier (6). И а и b должны быть положительными

1 8. integer procedure discrete (A, £/); name U\ array A;

integer U ; ' . . . , ": ' ., r

■"■ Одномерный массив А дополняется справа элементом, рав­ ным 1, и интерпретируется как интегральная функция рас­ пределения, аргументом которой является индекс. Массив А предполагается имеющим тип real. Доставляемое целочис­ ленное значение лежит в пределах [нижнгр,. верхнгр + 1], где нижнгр и верхнгр суть нижняя й верхняя границы индекса массива А. Оно определяется как наименьшее /, для которого А [I] > и, где и есть значение главной выборки и А [верхнгр + + 1]= 1. < . .

9. real procedure linear (Л, В, £/); name U; array Л,-В; integer U ;

Доставляемое значение распределено в соответствии с ин­тегральной функцией распределения F, получающейся линей­ной интерполяцией из неравношаговой таблицы, определен­ной массивами А и В так, что A [i] = F(B [/]).

. Предполагается, что А и В суть одномерные веществен­ ные массивы одинаковой длины, что первый и последний элементы массива А равны соответственно нулю и единице и что Л[/]>Л[/], B[i] > ВЦ] при / > /. Если какие-либо из этих условий не выполняются, результат процедуры зависит от конкретных способов реализации. 1" .

1 я

. 10. integer procedure histd (Л, U)\ name U\ array Л; integer £/; r '

Доставляет целочисленное значение в пределах [нижнгр, верхнгр], где нижнгр и верхнгр суть нижняя и верхняя гра­ницы индекса одномерного массива А. Этот массив интер-. претируется как гистограмма, определяющая относительную. частоту требующего значения индекса.

13. СЛУЖЕБНЫЕ ПРОЦЕДУРЫ

i

Определена следующая процедура: procedure histo (Л, В, с, d)\ array Л, В ; real с, d;

Эта процедура обновляет гистограмму, определенную одно­мерными массивами Л и В в соответствии с наблюденным значением с с весом d. При этом Л [i\ возрастает на d, где / есть наименьшее целое, удовлетворяющее неравенству с < *СВ[{\. Предполагается, что длина -массива Л на единицу, больше длины массива В. Последний элемент массива А от­вечает наблюденным значениям, превосходящим все

ния В [{{. Процедура допускает параметры типов real и in­teger в любой комбинации.

Если условие, накладываемое на длины массивов А и £, .це выполняется, то результат процедуры зависит от конкрет­ных способов ее реализации.

14.1.3. Класс link

14.1.3.1. Определение

linkage class link;

begin procedure out; ■ l

if SUC = / = none then

begin SUC. PRED : - PRED ; PRED.SUC:-SUC; SUC: -PRED:-none ' end out; procedure follow (X); ref (linkage) X;

begin out; ■ ~

if X = / = none then

begin if X. SUC = / = none then begin PRED:-X;

SUC:-X.SUC;

SUC. PRED : - X. SUC: -

this linkage end end

end follow;

procedure precede (X)\ ref (linkage) X; begin out;

if X = / = none then

begin if X. SUC = / = none then begin SUC:-A';

PRED:-X. PRED;

PRED. SUC : - X. PRED : -

this linkage

end

end ■ ' -

end precede;

procedure into (S); ref (head) S] begin out;

if S = I = none then begin SUC:-S;

PRED :-$. PRED;

PRED . SUC : - S. PRED : -

this linkage f end w

end into; end link; »

14.1.3.2. Семантика

1 ч

Объекты, принадлежащие к подклассам класса link, мо­гут становиться членами наборов. В каждый данный мрменг объект может быть членом только одного набора.

В дополнение к процедурам sue и pred имеются еще1 че­ тыре процедуры, связанные с каждым объектом класса link: out, follow, precede и into. " ■

Процедура out удаляет объект из набора, членом кото­ рого он является (если объект имеет членство в наборе). Если объект не состоит ни в каком наборе, то вызов про­ цедурной не влечет за собой никаких последствий. ' Процедуры follow и precede' удаляют объект из набора, членом которого он является (если объект имеет членство в наборе), и вставляют его в некоторый набор в указанную по­ зицию. Набор и позиция задаются параметром типа ref (lin­ kage). Если этот параметр имеет значение попе, или не имеет членства в наборе, или не является головой набора, то вызов процедур follow и precede имеет тот же эффект, что и вызов out (за исключением возможных последствий вычисления зна­ чения фактического параметра)*. В противном случае объект включается непосредственно <*вслед за» ^(follow) или непо­ средственно «перед» (precede) тем объектом класса linkage, на который указывает параметр.- "

Процедура into, которая имеет параметр типа ref (head), удаляет объект из набора, членом которого он является ^если объект имеет членство в наборе), и включает его в ка­ честве последнего члена в набор, указанный параметром. Если параметр есть попе, то вызов процедуры into имеет тот же эффект, что и вызов процедуры out (за исключением воз-1 можных последствий вычисления значения фактического па­ раметра), ' i ,

*

14.1.4. Класс head - " .. j

w

14Л.4.1. Определение

linkage class head; ;

begin ref (link) procedure first; first:— sue;

ref (link) procedure last;, last:— pred; .■• - Boolean procedure empty; _ :.

, . - l- empty:== SUC ===== this linkage; -:

integer procedure cardinal; - .

■ begin integer /; ref (linkage) X; « ■

. , , •-.-A: —this linkage; \. - '

for X: — X. sue while X = / = none . - - ,- ^ do /:=/+ 1 ;>

cardinal: = / ,

end cardinal; ,

procedure clear;

begin ref (link) X\

for X: — first while X = / = none do

'* . л - X.out

end clear;

. " SUC:-PRED:-this linkage , end head; .

14.1.4.2. Семантика

Объект класса head или подкласса класса head служит для представления набора. Объекты класса head не- могут ■становиться членами наборов. Таким образом, каждый набор имеет единственную «голову»'(head).

Процедуру first можно использовать для того, чтобы по­ручить ссылку на первый член набора, а процедуру last — на последний.

|-, Логическая процедура empty доставляет значение true, если набор не имеет членов.

г Целая процедура cardinal может быть использована для подсчета количества членов в наборе.

Процедурой clear можно воспользоваться для удаления всех членов из набора.

Ссылки SUC и PRED первоначально указывают на саму «голову», которая, таким образом, представляет пустой на­бор. '

\? 14.2. КЛАСС SIMULATION

Системный класс SIMULATION можно рассматривать как «пакет применений», предназначенный для решения задач моделирования. Он имеет в качестве префикса класс SIMSET и, таким образом, имеет непосредственный доступ к сред­ствам для манипуляций с наборами.

Определение класса SIMULATION, данное ниже, является лишь одним из многих возможных способов организации зтрго класса. При реализации языка можно выбрать любую другую схему, эквивалентную этой с точки зрения программы пользователя. %

. В последующих разделах понятия, определенные в классе SIMULATION, будут разъяснены в связи с префикс-блоком,

префиксальная часть которого является экземпляром тела ■ класса SIMULATION или некоторого его подкласса. Блок с префиксом действует как главная программа некоторой квазипараллельной системы, которая может представлять модель системы «с дискретными событиями».

14.2.1. Общая структура

14.2.1.1. Определение

SIMSET class SIMULATION;

begin link class EVENT NOTICE (EVTIME, PROC); "

real EVTIME; ref (process) PROC; begin ref (EVENT NOTICE) procedure suc;-

suc:-if SUC is EVENT NOTICE then SUC

else none;

ref (EVENT NOTICE) procedure pred; . . pred : - PRED;

procedure RANK (BEFORE); Boolean BEFORE; begin ref (EVENT NOTICE) P; P ■ — SOS . last * for />:-P*while P.EVTIME>EVTIME do

P: — P. pred; if BEFORE then begin for P: - P while P. EVTIME = EVTIME do

P : — P. pred end; follow (P)

end RANK; end EVENT NOTICE; link class process; begin ref (EVENT NOTICE) EVENT; end

process; ref (head) SQS;

ref (EVENT NOTICE) procedure FIRSTEV;

FIRSTEV:-SQS.first; ref (process) procedure current;

current: - FIRSTEV. PROC ; real procedure time; time : = FIRSTEV. EVTIME;

procedure hold ;

procedure passivate ......;

procedure wait ;

procedure cancel ;

procedure terminate ;

procedure ACTIVATE ;

procedure accum ;

process class MAIN PROGRAM ;

ref (MAIN PROGRAM) main; ■ SQS : — new head; .

main: - new MAIN PROGRAM; main.EVENT:-new EVENT NOTICE (0, main); main.EVENT.into (SQS) end SIMULATION;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]