Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [ 46 ] 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261

Ml. Получить и

Прямоугольник?

(МЗ. Клин или хвост?) >

Хвост

\ Клин

М4. Получить

) >

и <V

j;;yib. Простой случай?)->

ДаМб. Попытаемся снова?У

М7. Получить мажорирую- М8. Отбраковать?Л

щую случайную величину Ч, \" /

--1 уДа

М9. Присоединить знак

Т"

Рис. 12. Алгоритм прямоугольника-клина-хвоста для генерирования нормальных случайных величин.

Сейчас вероятность того, что X <s + hx для О < х < 1, - это площадь, лежащая слева от вертикальной линии U = х (см. рис. 11) и деленная на общую площадь, т. е.

f{s + hu)du 11 f{s + hu)du =

f{v)dv.

Следовательно, X имеет нужное распределение.

С подходящими константами uj , bj и Sj алгоритм L можно применять к клинообразным плотностям /,+15 (см. рис. 9) для 1 < j < 15. Последнее распределение F31 нуждается в обработке приблизительно один раз из 370; оно используется тогда, когда получаем результат АГ > 3. В упр. И показано, что стандартная схема отбраковки может использоваться для этого "хвоста". Рассмотрим процедуру в целом.

Алгоритм М (Метод прямоугольника-клина-хвоста для нормально распределенных случайных величин). Для этого алгоритма (рис. 12) используем вспомогательные таблицы {Ро,...,Рз1), (Qi,...,Qi5), {Yo,...,Y3i), {Zo,...,Z3i), (5i,... ,Si6), (J9i6,... ,1>зо), (Eie,... ,Езо), построенные так, как в упр. 10; примеры выбираются из табл. 1. Предполагается, что используется бинарный компьютер (подобные процедуры могут быть построены для десятичных машин).

Ml. [Получить и.] Генерируем равномерно распределенное случайное число U = (.606162.. .6()2. (Здесь bj - двоичные разряды в бинарном представлении U. Для приемлемой точности t должно быть по крайней мере равно 24.) Присвоить ф -(г- bo. (Позже ф будет использовано для определения знака результата.)



М2. [Прямоугольник?] Присвоить j (6162636465)2 (двоичное число определяется старшими двоичными разрядами U) и присвоить / i- (.бебу... bt)2 (дробная часть определяется оставшимися двоичными разрядами). Если f > Pj, присвоить X (г- Yj + fZj и перейти к шагу М9. Иначе, если j < 15 (т. е. 61 =0), присвоить X <г- Sj + fQj и перейти к шагу М9. (Это использование метода псевдонимов Уолкера (Walker) (3).)

МЗ. [Клин или хвост?] (Сейчас 15 < j < 31 и каждое определенное значение j появляется с вероятностью pj.) Если j = 31, перейти к шагу М7.

М4. [Получить и < V.] Генерировать две новые независимые равномерно распределенные случайные величины U иУ; если U > V, заменить U V. (Сейчас выполняется алгоритм L.) Присвоить X i- Sj-15 + \U.

М5. [Простой случай?] Если V < Dj, перейти к шагу М9.

Мб. [Попытаемся снова?] Если V > U -\- Ej{ef-*~-> - 1), вернуться к шагу М4; иначе - перейти к шагу М9. (Вероятность, что этот шаг нужно будет выполнять, мала.)

М7. [Получить мажорирующую стучайную величину.] Генерировать две новые независимые равномерно распределенные случайные величины (7 и F и присвоить X <г- v/9-21nl/.

М8. [Отбраковать?] Если UX >Ъ, возвратиться к шагу М7. (Это будет случаться приблизительно в одном из двенадцати случаев после достижения шага MS.)

М9. [Присоединить знак.] Если ф = 1, присвоить Л (--X

Этот алгоритм является очень миленьким примером тесного переплетения математической теории с изобретательностью программирования - прекрасная иллюстрация искусства программирования! На выполнение шагов Ml, М2 и М9 уходит почти все время; остальные шаги осуществляются намного быстрее. Впервые метод прямоугольника-клина-хвоста опубликовали Дж. Марсалья, Дж. Марсалья, М. Д. Мак-Ларен и Т. А. Брей (см. работы G. Marsaglia, Annals Math. Stat. 32 (1961), 894-899; G. Marsaglia, M. D. MacLaren, and T. A. Bray, CACM 7 (1964), 4-10). В дальнейшем алгоритм М усовершенствовали Дж. Марсалья, К. Ананханараянан и Н. Дж. Поль (см. работу G. Marsaglia, К. Ananthanarayanan, and N. J. Paul, Inf. Proc. Letters 5 (1976), 27-30).

3) Метод "чет-нечет" принадлежит Дж. Э. Форсайту (G. Е. Forsythe). Поразительно простая техника генерирования случайных величин с обычной экспоненциальной плотностью вида

f{x) = Ce-[a<x<b], (20)

О < Н{х) < 1 для а < ж < 6, (21)

была открыта Джоном фон Нейманом и Дж. Е. Форсайтом приблизительно в 1950 году. Идея основана на методе отбраковки, описанном ранее. Предпсшага-ется, что д{х) - это равномерное распределение на интервале [о..6). Присвоим X а -\- (Ь - a)U, где и - равномерно распределенная случайная величина, и примем X с вероятностью е"*-). Последняя операция может быть осуществлена путем сравнения e~ с V либо h{X) с -InV, когда V - другая равномерно



Таблица 1

ПРИМЕРЫ ТАБЛИЦ, ИСПОЛЬЗУЕМЫХ С АЛГОРИТМОМ М*

Zj+i6

Sj+i

Ej+is

.ООО

.067

0.00

0.59

0.20

0.21

.849

.161

.236

- 0.92

0.96

1.32

0.24

.505

25.00

.970

.236

.206

- 5.86

-0.06

6.66

0.26

.773

12.50

.855

.285

.234

- 0.58

0.12

1.38

0.28

.876

8.33

.994

.308

.201

-33.13

1.31

34.93

0.29

.939

6.25

.995

.304

.201

-39.55

0.31

41.35

0.29

.986

5.00

.933

.280

.214

- 2.57

1.12

2.97

0.28

.995

4.06

.923

.241

.217

- 1.61

0.54

2.61

0.26

.987

3.37

.727

.197

.275

0.67

0.75

0.73

0.25

.979

2.86

1.000

.152

.200

0.00

0.56

0.00

0.24

.972

2.47

.691

.112

.289

0.35

0.17

0.65

0.23

.966

2.16

.454

.079

.440

- 0.17

0.38

0.37

0.22

.960

1.92

.287

.052

.698

0.92

-0.01

0.28

0.21

.954

1.71

.174

.033

1.150

0.36

0.39

0.24

0.21

.948

1.54

.101

.020

1.974

- 0.02

0.20

0.22

0.20

.942

1.40

.057

.086

3.526

0.19

0.78

0.21

0.22

.936

1.27

*Практически эти данные могут быть приведены с намного большей точностью; в таблице приведено только достаточное количество цифр, чтобы интересующиеся читатели могли более точно проверить собственные алгоритмы вычисления значений.

распределенная случайная величина, но работу можно проделать без применения каких-либо трансцендентных функций следующим интересным способом. Присвоим Vq i- h{x) и будем генерировать обычные равномерно распределенные случайные величины Vi, V2, пока не найдутся К > I с Vk-i < V. Для фиксированных x и к вероятность того, что h{x) > Vi > • • • > V, равна 1/к\, умноженному на вероятность того, что ma.x{Vi,... ,Vk) < h{x), т. е. h{x)/k\. Следовательно, вероятность того, что К = к, равна h{x)~/{k - 1)! - h{x)/k\, а вероятность того, что К - нечетное число, равна

нечетное, fc>l

Следовательно, мы отбраковываем x и начинаем снова, если К - четное число. Принимаем x как случайную величину с плотностью распределения (20), если К - нечетное число. Обычно мы не генерируем много значений Vj, чтобы определить К, поскольку среднее значение К (при заданном x) равно k>o Рг(- > к) = E,>oWA! = eW<e.

Несколькими годами позже Форсайт показал, что этот подход приводит к получению эффективного метода вычисления нормальных случайных величин без использования вспомогательных программ для вычисления квадратных корней или логарифмов, как в алгоритмах Р и М. Его процедуру с улучшенным выбором интервалов [а..Ь), осуществленную И. Г. Аренсом (J. Н. Ahrens) и У. Дитером (и. Dieter), можно представить в виде алгоэитма.

Алгоритм F (Метод "чет-нечет" для нормальных случайных величин). Этот алгоритм генерирует нормальные случайные величины на бинарном компьютере; предполагается, что имеется приблизительно t-\-l двоичных разрядов точности. Он нуждается в таблице значений dj - Oj - Oj-i для I < j <t+l, где Oj определяется



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [ 46 ] 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261