Анимация
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

return %clist;

# weighted ran: получает хэш вероятностей

# и возвращает случайный элемент хэша sub weighted rand {

my %dist = @ ;

my ($key, $weight);

while (1) { # Чтобы избежать погрешностей вычислений

# с плавающей запятой (см. ниже).

гау $rand = rand,

while ( ($кеу, $weight) = each %dist ) { return $key if (Stand -= $weight) <0;

Комментарий

Функция gaussian rand реализует полярный метод Бокса-Мюллера для преобразования двух независимых случайных чисел с однородным распределением, лежащих в интервале от О до 1 в два числа с математическим ожиданием О и стандартным отклонением 1 (то есть распределенных по закону Гаусса). Чтобы сгенерировать числа с другим математическим ожиданием и стандартным отклонением, умножьте выходные данные gaussian rand на нужное стандартное отклонение и прибавьте математическое ожидание:

# gaussian rand - см. выше $mean = 25;

$sdev = 2;

$salary - gaussian rand() * $sdev + $mean; printfCYou have been hired at \$%.2f\n", $salary);

Функция weighted rand получает случайное число из интервала от О до 1. Затем она использует вероятности, сгенерированные weight to dist, и определяет, какому элементу соответствует это случайное число. Из-за погрешностей представления с плавающей запятой накопленные ошибки могут привести к тому, что возвращаемый элемент не будет найден. Поэтому код размещается в цикле while, который в случае неудачи выбирает новое случайное число и делает очередную попытку.

Кроме того, модуль Math::Random с CPAN содержит функции, генерирующие случайные числа для многих распределейий.

> Смотри также-

Описание функции rand в perlfunc(l); рецепт 2.7; документация по модулю Math::Random с CPAN.



2.11. Выполнение тригонометрических вычислений в градусах 81

2.11. Выполнение тригонометрических вычислений в градусах

Проблема

Требуется, чтобы в тригонометрических функциях использовались градусы вместо стандартных для Perl радианов.

Решение

Создайте функции для преобразований между градусами и радианами (2я радиан соответствуют 360 градусам).

BEGIN {

use constant PI => 3,14159265358979;

sub cleg2rad {

my $degrees = shift;

return (Sdegrees / 180) • PI;

sub rad2d6g {

my Sradians = shift;

return (Sradians / PI) - 180;

Также можно воспользоваться модулем Math::Trig:

use Math::Trig;

Sradians = deg2rad($degrees); Sdegrees = rad2deg($radians);

Комментарий

Если вам приходится выполнять большое количество тригонометрических вычислений, подумайте об использовании стандартных модулей Math::Trig или POSIX. В них присутствуют дополнительные тригонометрические функции, которых нет в стандартном Perl. Другой выход заюхючается в определении приведенных выше функций racl2cleg и cleg2rad. В Perl нет встроенной константы я, однако при необходимости ее можно вычислить настолько точно, насколько позволит ваше оборудование для вычислений с плавающей запятой. В приведенном выше решении п является константой, определяемой командой use constant. Синус угла, заданного в градусах, вычисляется следующим образом:

# Функции deg2rad и rad2def приведены выше или взяты из Math;:Trig sub degree sine {

my Sdegrees = shift;



return $result,

0 Смотри также-

Описание функций sm, cos и atan2 в perlfunc{\); стандартная документация по модулям P0S1X и Math::Tng.

2.12. Тригонометрические функции

Проблема

Требуется вычислить значения различных тригонометрических функций - таких как синус, тангенс или арккосинус.

Решение

в Perl существуют лишь стандартные тригонометрические функции sm, cos и atan2. С их помощью можно вычислить тангенс (tan) и другие тригонометрические функции:

sub tan {

my $theta = shift,

return sin($theta)/cos($theta),

В модуле POSIX представлен расширенный набор тригонометрических функций:

use POSIX,

$у = acos(3 7),

Модуль Math::Trig содержит полный набор тригонометрических функций, а также позволяет выполнять операции с комплексными аргументами (или дающие комплексный результат):

use Math Trig, $у = acos(3 7),

Комментарий

Если значение $theta равно nil, Зя/2 и т. д., в функции tan возникает исключительная ситуация деления на ноль, поскольку для этих углов косинус равен нулю. Аналогичные ошибки возникают и во многих функциях модуля Math::Trig. Чтобы перехватить их, воспользуйтесь конструкцией eval:

my Sradians = deg2rad($degrees), my $result= sin($radians),



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