Форум
Написать нам
  • Страница 1 из 1
  • 1
Модератор форума: as-master  
О функции RND()
as-masterДата: Суббота, 06 Января 2007, 01:34 | Сообщение # 1
Группа: Удаленные





Quote (toizy)
Как оказалось, RND() с каждым разом даёт всё больше повторяющихся значений.
Не верите, проверьте сами на массиве большой длины. Уж не знаю, к чему разработчики
привязали генератор

Кстати, это совсем не праздный вопрос.
Я давно заметил, что рэндом работает некорректно - одни цифры выдает чаще,
другие почти никогда. Еще когда делал интеллект-тест (у меня там более 500 вопросов
было), заметил, что некоторые вопросы, которые я занес в базу, НИКОГДА не выбираются!!!
Другие же, наоборот, вылетают слишком часто.

Предлагаю открыть отдельную тему, где это обсудить. Что я и делаю.

Итак, как с этим бороться?

 
as-masterДата: Суббота, 06 Января 2007, 14:08 | Сообщение # 2
Группа: Удаленные





Предлагаю такой вариант борьбы с гадским рэндомом.

Если нужно сгенерить, например, случайное число от 1 до 10,
то надо генерить число на порядок или два порядка выше - то есть,
например, от 1 до 1000. А затем результат разделить на сто.
Таким образом, снижается вероятность частого выпадания одних
и тех же чисел.

Для иллюстрации сказанного я сделал небольшой пример, где число
от 1 до 10 генерируется и обычным способом, и предложенным выше.
Результаты генерации заносятся в список, потом он сортируется и
сохраняется. И можно наглядно посмотреть, какое число сколько раз
выпало. По теории вероятности, каждое число должно выпасть в среднем 10 раз.

Так вот. При обычной генерации единица у меня выпала всего ДВА раза,
тогда как тройка и шестерка выпали по 15 раз.

При генерации предложенным способом результат оказался более ровным.

Плиз, возьмите пример и поиграйтесь сами smile Размер - 1 кб.
А может, и свои варианты предложите.

Ссылка: Пример рэндома
или файл, прикрепленный к посту:

Прикрепления: 11029676.zip (1.1 Kb)


Сообщение отредактировал as-master - Суббота, 06 Января 2007, 14:10
 
RushДата: Суббота, 06 Января 2007, 14:11 | Сообщение # 3
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
Quote (as-master)
Итак, как с этим бороться?

Написать свой алгоритм рандомизации...
Ты же в математике неплохо разбираешься - подумай над этим. Или можно поискать готовые решения. Наверное, они в инете должны быть.
 
as-masterДата: Суббота, 06 Января 2007, 14:17 | Сообщение # 4
Группа: Удаленные





Quote (Rush)
Написать свой алгоритм рандомизации... Ты же в математике неплохо разбираешься - подумай над этим.


Вот, один вариант уже предложил. Правда, он все равно
использует ММВ-шную рандомизацию, но выравнивает результаты.

Конечно, можно - И НУЖНО - подумать над своим алгоритмом.
Но мне именно хочется, чтобы над этим подумали другие члены клуба,
да и не члены клуба тоже.

И вообще, в результате коллективного обсуждения проблемы всегда
появляется более-менее разумное решение. Как говорится, одна голова -
хорошо, а десять - это вообще супер! :)

 
RushДата: Суббота, 06 Января 2007, 17:13 | Сообщение # 5
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
Попробовал внутренний рэндом ММВ погонять - результат довольно интересный.
Брал RND(10), то есть от 0 до 10. Оказывается - числа от 1 до 9 выпадают примерно одинаково. При 100 000 выпадений разница от 9750 до 10 150. Это крайние случаи, а чаще разница между большим и меньшим не превышает 200 выпадений (это 0,2%). А вот крайние числа совершенно выпадают - они вместе набирают такую же сумму, как остальные по отдельности.
И тут возникает идея - считать их за одно число - 10. smile
Это, конечно, еще не значит, что и на RND(20), например, такое сработает. Подозреваю, что чем больше чисел, тем шире полоса выбивающихся из ряда цифр. Но не проверял...
 
RushДата: Суббота, 06 Января 2007, 18:04 | Сообщение # 6
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
Попробовал на 100 цифрах - очень даже ровная рандомизация. Опять же, кроме первого и последнего числа.

Кто хочет погонять, скриптик совсем простой:

Code
ListBoxAddItem("SongList","RESET")
For i=1 To 100
a[i]=0
Next i
For i=1 To 100000
n=RND(99)+1
a[n]=a[n]+1
Next i
For i=1 To 100
a$=CHAR(a[i])
ListBoxAddItem("SongList","a$")
Next i

Rush, просьба заключать код в теги 'code'! - Yuriy

 
as-masterДата: Воскресенье, 07 Января 2007, 13:53 | Сообщение # 7
Группа: Удаленные





Действительно, проверил по сценарию, который предложил Rush, -
первое и последнее число выпадают в два раза реже остальных.
Тогда я применил в его скрипте предложенный мной способ:

ListBoxAddItem("SongList","RESET")
For i=1 To 100
a[i]=0
Next i
For i=1 To 100000
n=RND(9999)
n=n/100
n=INT(n)+1
a[n]=a[n]+1
Next i
For i=1 To 100
a$=CHAR(a[i])
ListBoxAddItem("SongList","a$")
Next i

И все значения выровнялись smile

Кто ничего не понял - может просто посмотреть готовый файл.
Здесь или в прищепке к посту.

=====================================
Юрий, не правь мой пост на предмет 'code' -
я так красиво скрипт раскрасил :)

Сам вижу! - Yuriy

Прикрепления: 79928987.zip (0.9 Kb)
 
KetzerДата: Пятница, 02 Марта 2007, 14:21 | Сообщение # 8
Новый участник
Группа: Пользователи
Сообщений: 11
Репутация: 0
Награды: 0
Статус: Offline
Вы путаете понятия. "Случайный" вовсе не значит "равновыпадающий".
Если вы потестриуете любой другой рэндом-генератор, получите примерно такие же цифры.
Не думаю, что для ММБ писался специальный - взяли стандартную функцию и не больше.

Другое дело, что в некоторых плейерах под "случайным" проигрыванием файлов подразумевается лишь произвольный порядок их воспроизведения. Если нужно именно это, то проблему можно решить написанием простенькой функции (использующей массивы чисел и все тот же RND()), которая будет строить список воспроизведения при изменении плэй-листа (удалении/добавлении файлов и т.д.).

 
as-masterДата: Пятница, 02 Марта 2007, 21:55 | Сообщение # 9
Группа: Удаленные





Quote (Ketzer)
Вы путаете понятия. "Случайный" вовсе не значит "равновыпадающий".

Спасибо, но никто ничего здесь не путает smile
Само собой, что случайный - не значит равновыпадающий.
Но по теории вероятности, при достаточно большом числе попыток, исходов (и так далее, не помню как там по терминологии) шансы всех исходов уравниваются. Не становятся равными, а уравниваются. Так что в среднем каждое число должно выпадать более или менее одинаковое число раз, плюс-минус небольшое отклонение.

Но какая же может идти речь о нормальной случайности (о нормальном рэндоме), в котором, заведомо известно, некоторые числа будут однозначно выпадать вдвое реже остальных???

 
KetzerДата: Суббота, 03 Марта 2007, 00:43 | Сообщение # 10
Новый участник
Группа: Пользователи
Сообщений: 11
Репутация: 0
Награды: 0
Статус: Offline
Предлагаю считать, что глюк в теории вероятностей :))
 
as-masterДата: Суббота, 03 Марта 2007, 08:31 | Сообщение # 11
Группа: Удаленные





Насчет теории вероятностей ничего сказать не могу,
но с глюком рэндома в ММВ мы уже разобрались конкретно :)
 
  • Страница 1 из 1
  • 1
Поиск: