Forum Webscript.Ru

Программирование => Теория, алгоритмы и стандарты => Тема начата: Макс от 12 Сентября 2003, 21:00:21

Название: Генератор псевдослучайных последовательностей.
Отправлено: Макс от 12 Сентября 2003, 21:00:21
задача :
нужно генерировать случайное число 1 из  7 (на самом деле задача более обширная 2 из 9, 3 из 10 и т.д., но проблема именно с 1 из 7). Реализация на php:
Если использовать mt_rand(1, 7); то при большом числе повторов :
for($i=0; $i < 100; $i++) {
   echo mt_rand(1, 7)."\\n";
}
можно заметить что сравнительно часто числа последовательно повторяются. Например у меня только что была такая цепочка:
3 5 5 5 3 3 3 1
Есть какие-то идеи/алгоритмы генераторов псевдослучайных чисел в которых бы такие повторы были не такими частыми. Не то, чтобы их совсем не было, но были бы как можно реже.
Вариант с запоминанием последнего сгенерированного числа и проверкой при последующем генерировании очень не хочется делать.

ЗЫ
Я пока что плохо знаком с математикой генераторов псевдослучайных последовательностей, поэтому если я многого хочу - так и скажите.
Название: Генератор псевдослучайных последовательностей.
Отправлено: КшЫуфксрук от 12 Сентября 2003, 23:10:32
А у меня выпало "7 7 7 4 4 4 4". Ну значит судьба такая. Если это не повторяется каждый раз, то все нормально. А двойки вообще должны очень часто выпадать, ведь вероятность того, что следующее число будет равно предыдущему, равна 1/7.
Название: Генератор псевдослучайных последовательностей.
Отправлено: Макс от 12 Сентября 2003, 23:32:42
дело в том что частенько выпадают такие последовательности:
1 4 4 5 6 6 2 4 1 1
То есть часто идут несколько цифр подряд - и мне такая "закономерность" ну очень не нравится.
Пока единственное что могу придумать: запомнить последнее сгенерированное число, при следующей генерации если новое число совпало со старым - генерируем новое число (его уже не проверяем) и запоминаем его.
Мне этот вариант кажется кривым, но ничего умнее пока в голову не приходит.
Название: Генератор псевдослучайных последовательностей.
Отправлено: Xander от 13 Сентября 2003, 11:09:51
а может попробовать генерить md5 хэш от значения time()?
не то, чтобы я пробовал, но по идее может помочь...
Название: Генератор псевдослучайных последовательностей.
Отправлено: КшЫуфксрук от 13 Сентября 2003, 13:22:57
Тебе нужно случайную последовательность или неповторяющуюся. Если случайную, то оставь как есть. Пары одинаковых чисел должны выпадать часто, чаще чем казалось бы они должны. Или объясни что тебе нужно сделать.
Название: Генератор псевдослучайных последовательностей.
Отправлено: Макс от 14 Сентября 2003, 15:21:59
Вот, что-бы не повторяться, версия этого топика на пхпклубе:
http://phpclub.net/talk/showthread.php?s=&threadid=40417&rand=22

если коротко, то повторы разрешены, но не должны быть такими частыми.
Вобщем-то я уже понял, что хочу слишком много для такого маленького диапазона.
Название: Генератор псевдослучайных последовательностей.
Отправлено: КшЫуфксрук от 14 Сентября 2003, 17:16:29
Ну там в принципе все уже объяснили. Либо у нас действительно случайная последовательность (точнее псевдослучайная, но в данном случае это не так важно) и тогда повторы будут достаточно частым явлением. Либо мы искусственным способом уменьшаем число повторов, но тогда это уже будет менее случайная последовательность. Что выбирать зависит от задачи.
Название: Генератор псевдослучайных последовательностей.
Отправлено: Tronyx от 15 Сентября 2003, 14:57:15
Макс mt_rand() мягко говоря стрёмная функция, используй - mt_srand() (http://ru2.php.net/mt_srand)
Название: Генератор псевдослучайных последовательностей.
Отправлено: Werwolf13 от 20 Сентября 2003, 18:20:24
Попробуй генерить случайное число в диапазоне от 1 до 70, делить его на 10, и извлекай целую часть. Тогда , возможно, распределение будет ближе к равномерному. А вообще есть некоторые критерии определения близости текущего распределения случайной величины к равномерному распределению (см. напр., Феллер Ф. Введение в теорию вероятностей и ее приложения. В 2-х томах.)
Название: Генератор псевдослучайных последовательностей.
Отправлено: Макс от 20 Сентября 2003, 19:11:19
всем спасибо.
тему можно прикрыть.
Название: Генератор псевдослучайных последовательностей.
Отправлено: Tronyx от 22 Сентября 2003, 14:10:15
Цитировать
Werwolf13:
Попробуй генерить случайное число в диапазоне от 1 до 70, делить его на 10, и извлекай целую часть. Тогда , возможно, распределение будет ближе к равномерному. А вообще есть некоторые критерии определения близости текущего распределения случайной величины к равномерному распределению (см. напр., Феллер Ф. Введение в теорию вероятностей и ее приложения. В 2-х томах.)

Цитировать
Tronyx:
используй - mt_srand()


[Topic closed]