Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2012, 08:42   #1
Mortimoro
Форумчанин
 
Регистрация: 03.12.2010
Сообщений: 334
По умолчанию Рандом

Озадачился вопросом рандомного наступления события. В простом случае, если нужно чтоб событие наступило с вероятностью 1%, можно поступить так:
PHP код:
$random=mt_rand(0,99);
if(
$random==0) echo "Событие наступило"
но что-то мне подсказывает, что вероятностью 1% тут и не пахнет - у одного пользователя ноль может проскакивать чаще, у другого вообще раз в сто лет.

Можно вести логирование наступления события для каждого пользователя и, если допустим, с 100-го раза событие так и не наступило, увеличиваем вероятность его наступления до 10%, если с 110-го раза событие не наступило, увеличиваем вероятность до 20% и так далее...
Аналогично, чтоб снизить вероятность повторения события дважды подряд, можно после выполнения события снизить вероятность его наступления до 0 или 0,5% и постепенно повышать.
При таком подходе, во-первых, используются ресурсы сервера для логирования и расчета каждого пользователя индивидуально (пусть и мизерные, но при большом количестве юзеров заметные), во-вторых, нужно обеспечить безопасность переменной, хранящей значение пройденных циклов (ведь если пользователь будет подделывать данное значение, он может доводить вероятность до 100%) - в итоге, для такой простой задачи как рандом, получится довольно раздутый код.

Как бы вы решили данную задачу, чтоб обеспечить приемлемое качество рандома при лаконичном коде?
Mortimoro вне форума Ответить с цитированием
Старый 18.06.2012, 08:47   #2
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

рандом работает верно .. другое дело - что вы хотите распределение этого рандома равномерным сделать - это вам в математику надо. А в целом - если вы запустите свой код в цикле например из 1000000 случаев - будет ваш 1% железно... и чем больше цикл - тем ближе к 1% )))
ADSoft вне форума Ответить с цитированием
Старый 18.06.2012, 09:07   #3
Mortimoro
Форумчанин
 
Регистрация: 03.12.2010
Сообщений: 334
По умолчанию

при 1000000 случаев согласен, но если я хочу обеспечить вероятность 10%, а событие наступило всего 10 раз за 200 циклов, сразу напрашивается вопрос "где мои 10% ???".
Ведь опять-таки, есть вероятность того, что из 200 циклов нужные числа появятся не более 1 раза и такие случаи хотелось бы ликвидировать.

Наиболее хороший пример - онлайн игры. Разработчик обещает вероятность уворота от удара 98%, а в логе боя видно, что противник не обладающий точностью удара попадает через каждые два-три удара... и таких боев довольно много. По нытью на форумах таких игр видно, что рандом не такой уж рандомный.
Mortimoro вне форума Ответить с цитированием
Старый 18.06.2012, 11:20   #4
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

еще раз повторяю.. рандом - рандомный... насколько можно.. все-таки это псевдослучаные числа... другое дело - что вы хотите гарантированные вероятности создавать ... это другое.
Как вариант предлагаю.... например массив [0..100]
если нужны 10%,
пока кол-во успешн записей != 10
в цикле генерируете случайное число от 0 до 100
смотрите массив с этим индексом - если в массиве 0 - записываете туда 1, если нет - то на начало цикла.... иначе успешн запись++ начало цикла

в результате у вас массив из 100 элементов..... и ровно в 10% его элементов 1....гарантировано!
ADSoft вне форума Ответить с цитированием
Старый 18.06.2012, 22:34   #5
Mortimoro
Форумчанин
 
Регистрация: 03.12.2010
Сообщений: 334
По умолчанию

а если вероятность 0,25%, тогда массив содержит 400 значений на каждого пользователя, из которых всего одно равно 1. Слишком большое выделение памяти для такого простого кусочка... тогда уже проще моим методом - нужно хранить всего одно значение, инкрементируемое при каждой итерации до наступления события.
Mortimoro вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
РАНДОМ kilogram PHP 3 12.05.2012 14:24
рандом ZoomHz Общие вопросы C/C++ 1 10.07.2011 20:22
Рандом Ya_Aston Помощь студентам 4 17.12.2010 22:43
Рандом mansp Общие вопросы C/C++ 1 12.12.2010 15:18
рандом Arcueid1691 Общие вопросы C/C++ 7 18.06.2009 00:58