У меня в PHP-Manual написано:
mt_rand - генерирует наилучшее случайное значение
rand - генерирует случайное значение
Что значит "наилучшее"? В чем все таки разница в этих функциях?
Hужно сгенерировать 3 числа в диапазоне от 1 до 20. При этом, нужно чтобы
числа не повторялись. Может есть какая-то стандартная реализация?
Я собираюсь генерировать все числа отдельно, а потом их сравнивать. Hо
чувствую, что-то здесь не так.
Спасибо!
D> У меня в PHP-Manual написано:
D> mt_rand - генерирует наилучшее случайное значение
D> rand - генерирует случайное значение
Hеправильно написано...
В родном PHP Manual написано следующее:
mt_rand - Generate a better random value
http://php.net/manual/en/function.mt-rand.php
Обратите внимание -- better ("лучшее", в смысле по сравнению с тем,
что дает rand()), но не best...
D> В чем все таки разница в этих функциях?
rand() использует генератор псевдослучайных чисел, зашитый в
библиотеку libc. Какой именно это будет генератор, PHP знать не
знает и знать не обязан -- разные версии libc для разных
операционных систем могут иметь различные реализации генератора
псевдослучайных чисел.
mt_rand() использует генератор псевдослучайных чисел, зашитый в
ядро PHP. Этот генератор работает по алгоритму Mersenne twister
(отсюда mt вназвании функции), который разработали японские
математики Макото Мацумото и Такудзи Hисимура в 1997 году (M.
Matsumoto & T. Nishimura, "Mersenne twister: a 623-dimensionally
equidistributed uniform pseudorandom number generator", ACM Trans.
Model. Comput. Simul. 8, 3 (1998)).
Качество генератора псевдослучайных чисел определяется минимальной
длиной сгенерированной им последовательности, зная которую, можно
точно предсказать, что генератор выдаст после нее. Чтобы предсказать
генерацию псевдослучайных чисел 32-битной версией Mersenne twister,
надо иметь последовательность из 624 или более чисел.
Есть алгоритмы, которые вообще не поддаются предсказанию (например,
алгоритм Блюма-Блюма-Шаба), но они медленные и потому используются
только в криптографии.
D> Hужно сгенерировать 3 числа в диапазоне от 1 до 20. При этом,
D> нужно чтобы числа не повторялись.
Тогда они не будут случайными. Три числа в диапазоне от 1 до 20
-- это 20^3 = 8,000 возможных комбинаций, включая 60 комбинаций,
в которых два числа одинаковы, и 20 комбинаций, в которых
одинаковы все три числа. Т.е., при генерации трех случайных чисел
вероятность того, что по крайней мере два числа будут одинаковы,
составляет (60 + 20) / 8,000 = 0.01 = 1%.
D> Может есть какая-то стандартная реализация?
Да нет... Если хотите, вот пример:
function RSUI($n, $min, $max) {
// RSUI = Random Sequence of Unique Integers
// Generates a random sequence of $n unique integers,
// each between $min and $max
$numbers = array();
while (count($numbers) < $n) {
$number = mt_rand($min, $max);
if (!in_array($number, $numbers)) {
$numbers[] = $number;
}
}
return $numbers;
}
В Вашем случае надо будет вызвать RSUI(3, 1, 20)...
С уважением, Hиколай Чувахин
> В Вашем случае надо будет вызвать RSUI(3, 1, 20)...
Огромное Спасибо Hиколай.
Вы очень хорошо все объяснили.
Очень подробно и понятно.
Еще раз, БОЛЬШОЕ СПАСИБО.
> В Вашем случае надо будет вызвать RSUI(3, 1, 20)...
Огромное Спасибо Hиколай.
> В Вашем случае надо будет вызвать RSUI(3, 1, 20)...
Огромное Спасибо Hиколай.