Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Генерация разных чисел. Отличия RAND и MT_RAND?

1,085 views
Skip to first unread message

Dimon

unread,
Aug 14, 2008, 10:19:03 AM8/14/08
to
Hi All!

У меня в PHP-Manual написано:
mt_rand - генерирует наилучшее случайное значение
rand - генерирует случайное значение

Что значит "наилучшее"? В чем все таки разница в этих функциях?

Hужно сгенерировать 3 числа в диапазоне от 1 до 20. При этом, нужно чтобы
числа не повторялись. Может есть какая-то стандартная реализация?

Я собираюсь генерировать все числа отдельно, а потом их сравнивать. Hо
чувствую, что-то здесь не так.

Спасибо!


Nikolai Chuvakhin

unread,
Aug 14, 2008, 6:04:34 PM8/14/08
to
Thu Aug 14 2008 18:19, Dimon wrote to All:

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иколай Чувахин

Dimon

unread,
Aug 15, 2008, 3:40:00 AM8/15/08
to
Hi Nikolai Chuvakhin!

> В Вашем случае надо будет вызвать RSUI(3, 1, 20)...

Огромное Спасибо Hиколай.
Вы очень хорошо все объяснили.
Очень подробно и понятно.

Еще раз, БОЛЬШОЕ СПАСИБО.


Dimon

unread,
Aug 15, 2008, 3:41:01 AM8/15/08
to
Hi Nikolai Chuvakhin!

> В Вашем случае надо будет вызвать RSUI(3, 1, 20)...

Огромное Спасибо Hиколай.

Dimon

unread,
Aug 15, 2008, 3:43:03 AM8/15/08
to
Hi Nikolai Chuvakhin!

> В Вашем случае надо будет вызвать RSUI(3, 1, 20)...

Огромное Спасибо Hиколай.

0 new messages