|
будьте только перед первым вызовом этой функции запустить 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(), но если файл содер-
жит очень много данных, это может быть довольно не экономично с точки зрения
расхода памяти. Наоборот, для случая коротких файлов способ единовременной за-
грузки предпочтительнее. Насколько коротких? Думаю, это легче всего определить
опытным путем. Рассмотренный нами способ решает проблему с большими файлами.
Глава 14. Математические функции 241
Отмечу, что использование обычной функции 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 единичек), потому что
это — не что иное, как представление шестна
|
|