Анимация
JavaScript
|
Главная Библионтека ( Замечание Я намеренно не рассматриваю функции rand() и srand(), потому что качество случайных чисел, которые они выдают, никуда не годится. Настоятельно рекомендую вместо них использовать описанные ниже функции, а про rand() вообще забыть. int mt rand(int $min=0, int $max=RAND MAX) Функция возвращает случайное число, достаточно равномерно даже для того, чтобы использовать ее в криптографии. Подробнее о том алгоритме, который она использует, можно прочитать в Интернете по адресу http: www.math.keio.ac.jp/~matumoto/emt.html, а исходные тексты найти по адресу http: www.scp.syr.edu/~marc/hawk/twister.html. Если вы хотите генерировать числа не от 0 до RAND MAX (эта константа задает максимально допустимое случайное число, и ее можно получить при помощи вызова mt getrandmax() ), задайте соответствующий интервал в параметрах $min и $max. Не забудьте только перед первым вызовом этой функции запустить mt srand() . Давайте теперь рассмотрим один из случаев применения функции mt rand(). Речь пойдет об извлечении строки со случайным номером из текстового файла (работу с файлами мы рассмотрим чуть позже, а пока скажу лишь, что функция fget() читает очередную строку из файла, дескриптор которого указан ей в первом параметре, а второй параметр задает максимально возможную длину этой строки, для нас это - очень большое число). Поступим так: for($i=0; mt rand(0,$i)<1; $i++) $s=fgets($OurFile,10000); echo "Случайная строка: $s"; Этот способ работает в строгом соответствии с теорией вероятностей: для первой строки вероятность ее извлечения будет 100%, для второй - 50% (она перепишется поверх первой), для третьей - 33%, и т. д. Например, если файл состоит всего из трех строк, то вероятность извлечения третьей строки, как мы уже заметили, будет равна 33%, а значит, первой или второй - соответственно, 66%. Но вероятность извлечения второй строки после первой равна 50%, а 50% от 66% будет также 33%, т. е. вероятность извлечения каждой строки одинакова. Мы видим, что для файла из трех строк алгоритм работает правильно. Не вдаваясь в математические подробности, скажу, что он работает верно и для любого количества строк. Безусловно, мы могли бы загрузить весь файл в память и выбрать из него нужную строку и при помощи одного-единственного вызова mt rand() , но если файл содержит очень много данных, это может быть довольно не экономично с точки зрения расхода памяти. Наоборот, для случая коротких файлов способ единовременной загрузки предпочтительнее. Насколько коротких? Думаю, это легче всего определить опытным путем. Рассмотренный нами способ решает проблему с большими файлами. Отмечу, что использование обычной функции rand() в этом примере просто невозможно - сказывается слишком плохое качество генерируемых ей случайных чисел, и строки вряд ли будут равновероятны. void mt srand(int $seed) Настраивает генератор случайных чисел на новую последовательность. Дело в том, что хотя числа, генерируемые mt rand() , достаточно равновероятны, но у них есть один недостаток (который, как это обычно бывает, иногда перерастает в достоинство): последовательность сгенерированных чисел будет одинакова если сценарий вызвать несколько раз подряд. Функция mt srand() как раз решает данную проблему: она выбирает новую последовательность на основе параметра $seed, причем практически непредсказуемым образом. Чаще всего ее инициализируют так: mt srand(time()+(double)microtime()*1000000); $randval = mt rand(); В этом случае последовательность устанавливается на основе времени запуска сценария (в секундах), поэтому она достаточно непредсказуема. Для еще более надежного результата рекомендуется приплюсовать сюда также микросекунды (что и было сделано), а также идентификатор процесса, вызвавшего сценарий. int mt getrandmax() Возвращает максимальное число, которое может быть сгенерировано функцией mt rand() - иными словами, константу rand max. Перевод в различные системы счисления string base convert(string $number, int $frombase, int $tobase) Переводит число $number (заданное как строка в системе счисления по основанию $frombase) в систему по основанию $tobase. Параметры $frombase и $tobase могут принимать значения только от 2 до 36 включительно. В строке $number цифры обозначают сами себя, буква a соответствует 11, b - 12, и т. д. до z, которая обозначает 36. Например, следующие команды выведут 11111111 (8 единичек), потому что это - не что иное, как представление шестнадцатеричного числа FF в двоичной системе счисления: echo base convert("FF",16,2); int bindec(string $binary string) Степенные функции float sqrt(float $arg) Возвращает квадратный корень из аргумента. Если аргумент отрицателен, то генерируется предупреждение, но работа программы не прекращается! Это выглядит довольно странно: интересно, что в этом случае возвращается функцией?.. float log(float $arg) Возвращает натуральный логарифм аргумента. В случае недопустимого числа печатает предупреждение, но, как и sqrt() , не завершает программу. float exp(float $arg) Возвращает e (2,718281828) в степени $arg. float pow(float $base, float $exp) Возвращает $base в степени $exp. Преобразует двоичное число, заданное в строке $binary string, в десятичное число. string decbin(int $number) Возвращает строку, представляющую собой двоичное представление целого числа $number. Максимальное число, которое еще может быть преобразовано, равно 2 147 483 647, которое выглядит как 31 единичка в двоичной системе. Существуют аналогичные функции для восьмеричной и шестнадцатеричной систем. Называются они так же, только вместо "bin" подставляется соответственно "oct" и "hex". Минимум и максимум mixed min(mixed $arg1 [int $arg2, int $argn]) Эта функция возвращает наименьшее из чисел, заданных в ее аргументах. Различают два способа вызова этой функции: с одним параметром или с несколькими. Если указан лишь один параметр (первый), то он обязательно должен быть массивом и возвращается минимальный элемент этого массива. В противном случае первый (и остальные) аргументы трактуются как числа с плавающей точкой, они сравниваются, и возвращается наименьшее. Тип возвращаемого значения выбирается так: если хотя бы одно из чисел, переданных на вход, задано в формате с плавающей точкой, то и результат будет с плавающей точкой, в противном случае результат будет целым числом. Обратите внимание на то, что с помощью этой функции нельзя лексикографически сравнивать строки - только числа. mixed max(mixed $arg1 [int $arg2, ... , int $argn]) Функция работает аналогично min() , только ищет максимальное значение. 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 |