Forum Webscript.Ru
Программирование => Теория, алгоритмы и стандарты => Тема начата: Макс от 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
Есть какие-то идеи/алгоритмы генераторов псевдослучайных чисел в которых бы такие повторы были не такими частыми. Не то, чтобы их совсем не было, но были бы как можно реже.
Вариант с запоминанием последнего сгенерированного числа и проверкой при последующем генерировании очень не хочется делать.
ЗЫ
Я пока что плохо знаком с математикой генераторов псевдослучайных последовательностей, поэтому если я многого хочу - так и скажите.
-
А у меня выпало "7 7 7 4 4 4 4". Ну значит судьба такая. Если это не повторяется каждый раз, то все нормально. А двойки вообще должны очень часто выпадать, ведь вероятность того, что следующее число будет равно предыдущему, равна 1/7.
-
дело в том что частенько выпадают такие последовательности:
1 4 4 5 6 6 2 4 1 1
То есть часто идут несколько цифр подряд - и мне такая "закономерность" ну очень не нравится.
Пока единственное что могу придумать: запомнить последнее сгенерированное число, при следующей генерации если новое число совпало со старым - генерируем новое число (его уже не проверяем) и запоминаем его.
Мне этот вариант кажется кривым, но ничего умнее пока в голову не приходит.
-
а может попробовать генерить md5 хэш от значения time()?
не то, чтобы я пробовал, но по идее может помочь...
-
Тебе нужно случайную последовательность или неповторяющуюся. Если случайную, то оставь как есть. Пары одинаковых чисел должны выпадать часто, чаще чем казалось бы они должны. Или объясни что тебе нужно сделать.
-
Вот, что-бы не повторяться, версия этого топика на пхпклубе:
http://phpclub.net/talk/showthread.php?s=&threadid=40417&rand=22
если коротко, то повторы разрешены, но не должны быть такими частыми.
Вобщем-то я уже понял, что хочу слишком много для такого маленького диапазона.
-
Ну там в принципе все уже объяснили. Либо у нас действительно случайная последовательность (точнее псевдослучайная, но в данном случае это не так важно) и тогда повторы будут достаточно частым явлением. Либо мы искусственным способом уменьшаем число повторов, но тогда это уже будет менее случайная последовательность. Что выбирать зависит от задачи.
-
Макс mt_rand() мягко говоря стрёмная функция, используй - mt_srand() (http://ru2.php.net/mt_srand)
-
Попробуй генерить случайное число в диапазоне от 1 до 70, делить его на 10, и извлекай целую часть. Тогда , возможно, распределение будет ближе к равномерному. А вообще есть некоторые критерии определения близости текущего распределения случайной величины к равномерному распределению (см. напр., Феллер Ф. Введение в теорию вероятностей и ее приложения. В 2-х томах.)
-
всем спасибо.
тему можно прикрыть.
-
Werwolf13:
Попробуй генерить случайное число в диапазоне от 1 до 70, делить его на 10, и извлекай целую часть. Тогда , возможно, распределение будет ближе к равномерному. А вообще есть некоторые критерии определения близости текущего распределения случайной величины к равномерному распределению (см. напр., Феллер Ф. Введение в теорию вероятностей и ее приложения. В 2-х томах.)
Tronyx:
используй - mt_srand()
[Topic closed]