|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
18.06.2012, 08:42 | #1 |
Форумчанин
Регистрация: 03.12.2010
Сообщений: 334
|
Рандом
Озадачился вопросом рандомного наступления события. В простом случае, если нужно чтоб событие наступило с вероятностью 1%, можно поступить так:
PHP код:
Можно вести логирование наступления события для каждого пользователя и, если допустим, с 100-го раза событие так и не наступило, увеличиваем вероятность его наступления до 10%, если с 110-го раза событие не наступило, увеличиваем вероятность до 20% и так далее... Аналогично, чтоб снизить вероятность повторения события дважды подряд, можно после выполнения события снизить вероятность его наступления до 0 или 0,5% и постепенно повышать. При таком подходе, во-первых, используются ресурсы сервера для логирования и расчета каждого пользователя индивидуально (пусть и мизерные, но при большом количестве юзеров заметные), во-вторых, нужно обеспечить безопасность переменной, хранящей значение пройденных циклов (ведь если пользователь будет подделывать данное значение, он может доводить вероятность до 100%) - в итоге, для такой простой задачи как рандом, получится довольно раздутый код. Как бы вы решили данную задачу, чтоб обеспечить приемлемое качество рандома при лаконичном коде? |
18.06.2012, 08:47 | #2 |
Старожил
Регистрация: 25.02.2007
Сообщений: 4,177
|
рандом работает верно .. другое дело - что вы хотите распределение этого рандома равномерным сделать - это вам в математику надо. А в целом - если вы запустите свой код в цикле например из 1000000 случаев - будет ваш 1% железно... и чем больше цикл - тем ближе к 1% )))
|
18.06.2012, 09:07 | #3 |
Форумчанин
Регистрация: 03.12.2010
Сообщений: 334
|
при 1000000 случаев согласен, но если я хочу обеспечить вероятность 10%, а событие наступило всего 10 раз за 200 циклов, сразу напрашивается вопрос "где мои 10% ???".
Ведь опять-таки, есть вероятность того, что из 200 циклов нужные числа появятся не более 1 раза и такие случаи хотелось бы ликвидировать. Наиболее хороший пример - онлайн игры. Разработчик обещает вероятность уворота от удара 98%, а в логе боя видно, что противник не обладающий точностью удара попадает через каждые два-три удара... и таких боев довольно много. По нытью на форумах таких игр видно, что рандом не такой уж рандомный. |
18.06.2012, 11:20 | #4 |
Старожил
Регистрация: 25.02.2007
Сообщений: 4,177
|
еще раз повторяю.. рандом - рандомный... насколько можно.. все-таки это псевдослучаные числа... другое дело - что вы хотите гарантированные вероятности создавать ... это другое.
Как вариант предлагаю.... например массив [0..100] если нужны 10%, пока кол-во успешн записей != 10 в цикле генерируете случайное число от 0 до 100 смотрите массив с этим индексом - если в массиве 0 - записываете туда 1, если нет - то на начало цикла.... иначе успешн запись++ начало цикла в результате у вас массив из 100 элементов..... и ровно в 10% его элементов 1....гарантировано! |
18.06.2012, 22:34 | #5 |
Форумчанин
Регистрация: 03.12.2010
Сообщений: 334
|
а если вероятность 0,25%, тогда массив содержит 400 значений на каждого пользователя, из которых всего одно равно 1. Слишком большое выделение памяти для такого простого кусочка... тогда уже проще моим методом - нужно хранить всего одно значение, инкрементируемое при каждой итерации до наступления события.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
РАНДОМ | 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 |