Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

 
liveinternet.ru: показано количество просмотров и посетителей

Библиотека :: Компьютеры и Программирование :: Котеров Д. В. - Самоучитель PHP 4
<<-[Весь Текст]
Страница: из 287
 <<-
 
будьте только перед первым вызовом этой функции запустить 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 единичек), потому что 
это — не что иное, как представление шестна
 
<<-[Весь Текст]
Страница: из 287
 <<-