Windows. Железо. Интернет. Безопасность. Программы
  • Главная
  • Windows 7
  • Рандом дробных чисел php. Генерация случайных чисел в пределах диапазона. Использование функции времени

Рандом дробных чисел php. Генерация случайных чисел в пределах диапазона. Использование функции времени

Технически термин «генератор случайных чисел» – это абсурд, так как числа сами по себе не являются случайными. Например, 100 – это случайное число? А 25? Что в действительности означает этот термин, так это то, что создается последовательность чисел, появляющихся случайным образом. Это порождает более сложный вопрос: что такое последовательность случайных чисел? Единственно правильный ответ: последовательность случайных чисел – это последовательность, в которой все элементы являются несвязанными. Это определение приводит к такому парадоксу, что любая последовательность может быть как случайной, так и неслучайной в зависимости от того, как эта последовательность получена. Например, следующая строка чисел
1 2 3 4 5 6 7 8 9 0
была получена печатанием верхней строки клавиатуры по порядку, таким образом, последовательность не может рассматриваться как сгенерированная случайным образом. Но как быть, если вы получите ту же самую последовательность, вынимая пронумерованный теннисные шары из бочонка. В данном случае это уже случайным образом сгенерированная последовательность. Данный пример показывает, что случайность последовательности зависит от того, как она была получена, а не от нее самой.

Помните, что последовательность чисел, сгенерированная компьютером, является детерминированной: каждое число, кроме первого, зависит от предшествующих чисел. Технически это означает, что компьютером может быть сгенерирована только квазислучайная последовательность чисел, т.е. на самом деле они не являются истинно случайными. Однако, этого достаточно для большинства задач и такие последовательности для простоты будут называться случайными. Один очень интересный метод был разработан Джоном фон Нейманом; его часто называют среднеквадратичным. В данном методе предыдущее случайное число возводится в квадрат, а затем из результата выделяются средние цифры. Например, если вы создаете числа из трех цифр, а предыдущее число было 121, то возведение в квадрат дает результат 14641. Выделение трех средних цифр дает следующее случайное число 464. Недостатком данного метода является то, что он имеет очень короткий период повторения, называемый циклом. По данной причине данный метод сегодня не используется. Современные методы генерации случайных чисел значительно сложнее.

Случайные числа в PHP

В PHP есть две группы функций по работе со случайными числами. Чисто внешне их можно отличить по префиксу mt_ у всех функций одной из групп.

Устаревшие функции
Функция rand. Возвращает целое число от нуля до значения RAND_MAX (которое равно 32767). Может иметь два необязательных целых параметра - если они указаны, то генерируется случайное число от первого параметра до второго.

Echo rand(); echo rand(1,100); // Выдаем случайное число от 1 до 100

Функция srand. Задает последовательность случайных чисел, выдаваемую функцией rand. Имеет целый параметр - при разных значениях этого параметра rand будет выдавать разные последовательности чисел. Функцию srand достаточно вызвать только один раз перед всеми вызовами функции rand. Пример использования:

Srand(1288); // Инициализация генератора случайных чисел for($i=0; $i= 3.0.6, PHP 4, PHP 5)

Описание:

Int mt_getrandmax (void)

Показывает максимальное значение, которое может быть возвращено функцией mt_rand()

mt_rand()

Генерирует лучшее случайное значение (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Описание:

Int mt_rand ()

Многие генераторы случайных чисел старых версий имеют сомнительные характеристики и работают медленно. По умолчанию PHP использует генератор случайных чисел функции rand(). Функция mt_rand() является хорошей ее заменой. Она использует рандомный генератор чисел, работающий в 4 раза быстрее, чем rand(), и использующий Mersenne Twister.

Вызванная без необязательных аргументов min и max, mt_rand() возвращает псевдо-случайное значение, расположенное между 0 и RAND_MAX. При необходимости получить, к примеру, случайные значения между 5 и 15 включительно, ишется mt_rand (5, 15).

Пример применения mt_rand()

Результатом выполнения данного примера будет что-то подобное:

1604716014
1478613278
6

Замечание

Замечание : В версиях до 3.0.7 второй параметр функции указывал диапазон чисел. Например, для получения случайных чисел между 5 и 15 в этих версиях требуется задать функцию mt_rand (5, 11).

mt_srand()

Устанавливает начальное значение лучшего генератор случайных чисел (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Описание:

Void mt_srand ()

Устанавливает начальное значение генератора случайных чисел с помощью seed. Начиная с PHP 4.2.0, seed не является обязательной, и установки по умолчанию для случайных значений опускаются.

Пример использования mt_srand()

Замечание : Начиная с PHP 4.2.0, больше нет необходимости инициализировать генератор случайных чисел функциями srand() или mt_srand(), поскольку теперь это происходит автоматически.

А теперь берем уже готовую функцию генерации пароля и пишем скрипт для восстановления или создания нового пароля для пользователей вашего сайта.

Скрипт восстановления пароля

Как обычно пишется скрипт?

Как всегда составляется поэтапная схема, что мы должны сделать по шагам. Все происходит в одном файле, reminder.php

1. Запускаем скрипт, только при наличии определенной переменной, например $action;

2. Для запуска процесса генерации пароля, пользователь указывает email адрес $_POST[`ema‘l`]; Для упрощения кода присвоим данное значение переменной $email.

3. Проверяем при помощи регулярных выражений все символы на то, чтобы пользователь правильно указал адрес емайл. Если нет, выводим ошибку, прекращаем работу скрипта. Если все правильно, идем дальше.

4. Ищем в базе данных, в нашем случае в таблице users пользователя с таким почтовым адресом. Если нет, выдаем ошибку, что такого адреса в базе нет, и прекращаем работу скрипта.

5. Пользователь с таким адресом в базе есть, идем дальше и запускаем функцию генерации нового пароля. Также по адресу емайл получаем из базы уникальный id пользователя и пишем в переменную $id;

Задача
Необходимо сгенерировать случайное число в пределах числового диапазона.

Решение
Для этого предназначена функция mt_rand():

// случайное число между $upper и $lower, включительно
$random_number = mt_rand($lower, $upper);

Обсуждение
Генерация случайных чисел полезна, когда надо вывести на экран случайную картинку, случайным образом назначить стартовую точку в игре, выбрать случайную запись из базы данных или сгенерировать уникальный идентификатор сессии. Для того чтобы сгенерировать случайное число в интервале между двумя точками, надо передать функции mt_rand() два аргумента:

$random_number = mt_rand(1, 100);

Вызов функции mt_rand() без аргументов возвращает число между нулем и максимальным случайным числом, возвращенным функцией mt_getrandmax(). Компьютеру трудно сгенерировать действительно случайное число. Намного лучше он умеет методически следовать инструкциям и не так хорош, если от него требуются спонтанные действия. Если необходимо заставить компьютер выдать случайное число, то нужно дать ему определенный набор повторяемых команд, при этом сам факт повторяемости делает достижение случайности менее вероятным.

PHP имеет два различных генератора случайных чисел: классическую функцию под именем rand() и более совершенную функцию mt_rand().

MT (Mersenne Twister) – это генератор псевдослучайных чисел, названный в честь французского монаха и математика Марена Мерсенн (Marin Mersenne), исследовавшего простые числа. На этих простых числах и основан алгоритм данного генератора. Функция mt_rand() работает быстрее, чем функция rand(), и дает более случайные числа, поэтому мы отдаем предпочтение первой из них.

Если у вас версия PHP более ранняя, чем 4.2, то перед тем как первый раз вызвать функцию mt_rand() (или rand()), нужно инициализировать генератор начальным значением путем вызова функции mt_srand() (или srand()). Начальное значение – это число, которое случайная функция использует как основу для генерации возвращаемых ею случайных чисел; это относится к способу разрешения упомянутой выше дилеммы – повторяемость против случайности.

В качестве начального значения, меняющегося очень быстро и с малой вероятностью повторяемости (именно этими свойствами должно характеризоваться хорошее начальное значение), можно взять значение, возвращенное высокоточной функцией времени microtime(). Генератор достаточно инициализировать один раз. PHP 4.2 и более поздних версий автоматически управляет инициализацией, но если начальное значение устанавливается вручную перед первым вызовом функции mt_rand(), то PHP не заменяет его своим собственным начальным значением.

Если нужно выбрать случайную запись из базы данных, то проще всего сначала определить общее количество полей в таблице, выбрать случайное число из этого диапазона, а затем запросить эту строку из базы данных:

$sth = $dbh->query("SELECT COUNT(*) AS count FROM quotes");
if ($row = $sth->fetchRow()) {
$count = $row;
} else {
die ($row->getMessage());
}
$random = mt_rand(0, $count - 1);
$sth = $dbh->query("SELECT quote FROM quotes LIMIT $random,1");
while ($row = $sth->fetchRow()) {
print $row .

"\n";
}

Этот фрагмент кода определяет общее количество строк в таблице, генерирует случайное число из этого диапазона, а затем использует LIMIT $random,1 для выбора (SELECT) одной строки из таблицы, начиная с позиции $random. В MySQL версии 3.23 или выше возможен альтернативный вариант:

$sth = $dbh->query("SELECT quote FROM quotes ORDER BY RAND() LIMIT 1");
while ($row = $sth->fetchRow()) {
print $row . "\n";
}

В этом случае MySQL сначала располагает строки в случайном порядке, а затем возвращает первую строку.

Лучшие статьи по теме