О функции 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 раз. При генерации предложенным способом результат оказался более ровным. Плиз, возьмите пример и поиграйтесь сами Размер - 1 кб. А может, и свои варианты предложите. Ссылка: Пример рэндома или файл, прикрепленный к посту:
Сообщение отредактировал 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. Это, конечно, еще не значит, что и на 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 И все значения выровнялись Кто ничего не понял - может просто посмотреть готовый файл. Здесь или в прищепке к посту. ===================================== Юрий, не правь мой пост на предмет 'code' - я так красиво скрипт раскрасил :) Сам вижу! - Yuriy
|
|
| |
Ketzer | Дата: Пятница, 02 Марта 2007, 14:21 | Сообщение # 8 |
Новый участник
Группа: Пользователи
Сообщений: 11
Репутация: 0
Награды: 0
Статус: Offline
| Вы путаете понятия. "Случайный" вовсе не значит "равновыпадающий". Если вы потестриуете любой другой рэндом-генератор, получите примерно такие же цифры. Не думаю, что для ММБ писался специальный - взяли стандартную функцию и не больше. Другое дело, что в некоторых плейерах под "случайным" проигрыванием файлов подразумевается лишь произвольный порядок их воспроизведения. Если нужно именно это, то проблему можно решить написанием простенькой функции (использующей массивы чисел и все тот же RND()), которая будет строить список воспроизведения при изменении плэй-листа (удалении/добавлении файлов и т.д.).
|
|
| |
as-master | Дата: Пятница, 02 Марта 2007, 21:55 | Сообщение # 9 |
Группа: Удаленные
| Quote (Ketzer) | Вы путаете понятия. "Случайный" вовсе не значит "равновыпадающий". | Спасибо, но никто ничего здесь не путает Само собой, что случайный - не значит равновыпадающий. Но по теории вероятности, при достаточно большом числе попыток, исходов (и так далее, не помню как там по терминологии) шансы всех исходов уравниваются. Не становятся равными, а уравниваются. Так что в среднем каждое число должно выпадать более или менее одинаковое число раз, плюс-минус небольшое отклонение. Но какая же может идти речь о нормальной случайности (о нормальном рэндоме), в котором, заведомо известно, некоторые числа будут однозначно выпадать вдвое реже остальных???
|
|
| |
Ketzer | Дата: Суббота, 03 Марта 2007, 00:43 | Сообщение # 10 |
Новый участник
Группа: Пользователи
Сообщений: 11
Репутация: 0
Награды: 0
Статус: Offline
| Предлагаю считать, что глюк в теории вероятностей :))
|
|
| |
as-master | Дата: Суббота, 03 Марта 2007, 08:31 | Сообщение # 11 |
Группа: Удаленные
| Насчет теории вероятностей ничего сказать не могу, но с глюком рэндома в ММВ мы уже разобрались конкретно :)
|
|
| |