- Автор темы
- #1
Хочу поделиться опытом об особенностях функций rand в PHP. Хочется сразу заметить, что на самом деле это псевдо-случайные числа и сейчас вы увидите, что вовсе не случайные.
Каждый раз перед генерацией случайного числа запускается ф-ция srand, которая устанавливает seed. На основе этого сида будет получено якобы случайное число. У одного сида выходит всегда одно и то же число!
Причём, сидом для следующего вызова любой rand или mt_rand ф-ции становится предыдущее случайное число, т.е. 7040, значит след. случайное число будет 26041.
Хватит лирики, чем это опасно. Ф-ция array_rand для получения случайного значения использует сид установленный srand(). Т.е. если вы генерируете к примеру сайт - в итоге могут получиться несколько совершенно одинаковых сайтов если вдруг совпадут сиды! Причём, совпасть нужно лишь первому сиду, все остальные rand'ы будут возвращать одно и то же.
По-этому перед каждым запуском рандом-фций советую делать srand( mt_rand() ); и перед mt_rand вызывать mt_srand() без параметров, чтобы не использовалось предыдущее полученое значение.
Буду рад услышать любые замечания/дополнения.
Каждый раз перед генерацией случайного числа запускается ф-ция srand, которая устанавливает seed. На основе этого сида будет получено якобы случайное число. У одного сида выходит всегда одно и то же число!
PHP:
<?php
srand( 3 );
echo rand(); // всегда вернёт 7040
Причём, сидом для следующего вызова любой rand или mt_rand ф-ции становится предыдущее случайное число, т.е. 7040, значит след. случайное число будет 26041.
PHP:
<?php
srand( 3 );
echo rand(); // всегда вернёт 7040
echo rand(); // всегда вернёт 26041
Хватит лирики, чем это опасно. Ф-ция array_rand для получения случайного значения использует сид установленный srand(). Т.е. если вы генерируете к примеру сайт - в итоге могут получиться несколько совершенно одинаковых сайтов если вдруг совпадут сиды! Причём, совпасть нужно лишь первому сиду, все остальные rand'ы будут возвращать одно и то же.
По-этому перед каждым запуском рандом-фций советую делать srand( mt_rand() ); и перед mt_rand вызывать mt_srand() без параметров, чтобы не использовалось предыдущее полученое значение.
Буду рад услышать любые замечания/дополнения.