Автор Тема: Генератор псевдослучайных последовательностей.  (Прочитано 7229 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
задача :
нужно генерировать случайное число 1 из  7 (на самом деле задача более обширная 2 из 9, 3 из 10 и т.д., но проблема именно с 1 из 7). Реализация на php:
Если использовать mt_rand(1, 7); то при большом числе повторов :
for($i=0$i 100$i++) {
   echo 
mt_rand(17)."\\n";
}

можно заметить что сравнительно часто числа последовательно повторяются. Например у меня только что была такая цепочка:
3 5 5 5 3 3 3 1
Есть какие-то идеи/алгоритмы генераторов псевдослучайных чисел в которых бы такие повторы были не такими частыми. Не то, чтобы их совсем не было, но были бы как можно реже.
Вариант с запоминанием последнего сгенерированного числа и проверкой при последующем генерировании очень не хочется делать.

ЗЫ
Я пока что плохо знаком с математикой генераторов псевдослучайных последовательностей, поэтому если я многого хочу - так и скажите.
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн КшЫуфксрук

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 99
  • +0/-0
  • 0
    • Просмотр профиля
    • http://risearch.org/
А у меня выпало "7 7 7 4 4 4 4". Ну значит судьба такая. Если это не повторяется каждый раз, то все нормально. А двойки вообще должны очень часто выпадать, ведь вероятность того, что следующее число будет равно предыдущему, равна 1/7.

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
дело в том что частенько выпадают такие последовательности:
1 4 4 5 6 6 2 4 1 1
То есть часто идут несколько цифр подряд - и мне такая "закономерность" ну очень не нравится.
Пока единственное что могу придумать: запомнить последнее сгенерированное число, при следующей генерации если новое число совпало со старым - генерируем новое число (его уже не проверяем) и запоминаем его.
Мне этот вариант кажется кривым, но ничего умнее пока в голову не приходит.
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Xander

  • санитар леса
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1780
  • +0/-0
  • 2
    • Просмотр профиля
а может попробовать генерить md5 хэш от значения time()?
не то, чтобы я пробовал, но по идее может помочь...
•••Jah\'d never let us down!•••

Оффлайн КшЫуфксрук

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 99
  • +0/-0
  • 0
    • Просмотр профиля
    • http://risearch.org/
Тебе нужно случайную последовательность или неповторяющуюся. Если случайную, то оставь как есть. Пары одинаковых чисел должны выпадать часто, чаще чем казалось бы они должны. Или объясни что тебе нужно сделать.

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Вот, что-бы не повторяться, версия этого топика на пхпклубе:
http://phpclub.net/talk/showthread.php?s=&threadid=40417&rand=22

если коротко, то повторы разрешены, но не должны быть такими частыми.
Вобщем-то я уже понял, что хочу слишком много для такого маленького диапазона.
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн КшЫуфксрук

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 99
  • +0/-0
  • 0
    • Просмотр профиля
    • http://risearch.org/
Ну там в принципе все уже объяснили. Либо у нас действительно случайная последовательность (точнее псевдослучайная, но в данном случае это не так важно) и тогда повторы будут достаточно частым явлением. Либо мы искусственным способом уменьшаем число повторов, но тогда это уже будет менее случайная последовательность. Что выбирать зависит от задачи.

Оффлайн Tronyx

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 826
  • +0/-0
  • 2
    • Просмотр профиля
Макс mt_rand() мягко говоря стрёмная функция, используй - mt_srand()
С уважением, Владимир Гончаренко - COPI# 93
Ролевая онлайн игра

Оффлайн Werwolf13

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 76
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Попробуй генерить случайное число в диапазоне от 1 до 70, делить его на 10, и извлекай целую часть. Тогда , возможно, распределение будет ближе к равномерному. А вообще есть некоторые критерии определения близости текущего распределения случайной величины к равномерному распределению (см. напр., Феллер Ф. Введение в теорию вероятностей и ее приложения. В 2-х томах.)

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
всем спасибо.
тему можно прикрыть.
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Tronyx

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 826
  • +0/-0
  • 2
    • Просмотр профиля
Генератор псевдослучайных последовательностей.
« Ответ #10 : 22 Сентября 2003, 14:10:15 »
Цитировать
Werwolf13:
Попробуй генерить случайное число в диапазоне от 1 до 70, делить его на 10, и извлекай целую часть. Тогда , возможно, распределение будет ближе к равномерному. А вообще есть некоторые критерии определения близости текущего распределения случайной величины к равномерному распределению (см. напр., Феллер Ф. Введение в теорию вероятностей и ее приложения. В 2-х томах.)

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


[Topic closed]
С уважением, Владимир Гончаренко - COPI# 93
Ролевая онлайн игра

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28