Генератор случайных чисел и дроп карт.
-
sivka, как это не соответствует?... почему это?
-
@"mjaffk":
sivka, как это не соответствует?... почему это?ну сам подумай , как мона длать какие-то прогнозы если генератор
не только по одному типу ITEMa работает. это просто обсолютно
случайные совподения, что вообще что-то дропается (немногу перегнул).прогноз droprate -> 0,01 (~10.000 мобов оного типа) уже некатит.
-
да там все просто
почитай <!-- m --><a class="postlink" href="http://motronline.com/f/viewtopic.php?t=1281">http://motronline.com/f/viewtopic.php?t=1281</a><!-- m -->
-
я непытаюсь сказать, что drop неправильно работет и емулятор
никуда негодится, просто напросто прогноз никудышный, как
при высокой droprate так и при низкой droprate.на практике: возьмём ту же самую двойную аттаку воришки.
двойная аттака работает по этой формуле
[code:uvojhoyi](rand()%100 < (skill*5))[/code:uvojhoyi]
тоесть на десятом левеле каждый второй удар должен быть двойным.так как генератор один, возможна следующая ситуацыя:
два воришки с прокаченой доубл аттак до лев10, рядушком на одной
карте рубят мобов, один воришка бьёт постоянно двойным ударом а
другой простыми ударми, так как первому воришке генератор
выкидывает постоянно число ниже 50-и, а второму постоянно
выше 50-и (не реально, но возможно).
если это пример расширить на рарный шмот, то первый воришка
будет выбивать рарный шмот, а второй в дырочку смотреть!resume:
при высоком онлайне (с учётом все будут играть) будет по идей
неплохой разброс и каждый в конце концов получит чего хочет. -
вкратце..
рассчёт дропа при убийстве монстра таков:[code:2s4a3e5s]для_каждой_вещи (выпадающая_из_моба_вещь) {
халявное_число = получить_халявное_число(от 1 до 10000);
если (халявное_число <= выпадающая_из_моба_вещь.дропрейт) { // целое число
дропнуть_вещь(выпадающая_из_моба_вещь);
}
}[/code:2s4a3e5s]вот вероятность выпадания карты (0.01%) в зависимости от убитых мобов:
*ф-ла: общая_вероятность := 1 - (1 - вероятность_выпадания)^кол_во_убитых_мобов (вроде как, формулу сам придумал ;))
-
флужу. лаги
тоесть на десятом левеле каждый второй удар должен быть двойным.
это литературное выражение. на самом деле, может быть что угодно, к примеру, [0 1 0 1 0 0 1 1 0 1 0 0 0 0 1 1 0 1 1 0 0 1 1 1 1 1 1 1 0 0].. но суммы двойных ударов (1) и простых (0) должны быть примерно равны (так как 50 на 50, или сколько там, - это неважно). другое дело, что сишная функция rand() иногда генерит как раз [0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ...]
-
Хех, налицо укоренившееся заблуждение у Сивки.... если считать
шанс Х - шанс выпадения воришке1 картыА
и
шанс Y - шанс выпадения воришке2 картыА
то эти два события никоим образом не влияют друг на друга.
Воришка1 убивает своих монстров и для них считаются вероятности, а воришка2 - своих, и для них тоже считаются вероятности.
Тот факт что один выбьет карту не повлияет на вычисления второго.
Это как если ты будешь в двух разных местах Земли кидать по кубику и считать вероятность выпадения 6, эти события никак не влияют друг на друга.
Как я уже писал, решает только количество убитых тобой монстров а не то сколько монстров убили другие.
Получалось бы некрасиво, еслиб карта просчитывалась во время рождения монстра а не после его смерти. Тогда действия одного зависели бы от другого.
-
Мистикал, всё дело в работе сишных ранд() и сид().. эти функции генерируют псевдослучайный ряд чисел, то есть, можно всегда знать следующее число. если эта функция не пересеевается заново каждый раз, то Х самым прямым образом влияет на Y, насколько я понял.
хотя всё равно это неважно, ведь людей много, а значения, выбрасываемые функцией - рандомные, и ничего бы не изменилось, даже если бы все эти значения, бывшие и будущие, были бы опубликованы на сайте.
-
Т.е. по сути генератор не очень, но с учётом онлайна сервера вполне покатит
Может закроем тему подискутируем ещё о чём-нибудь? Например, почему сейчас на сервере дамаг приходит с задержкой, почему агрессивные монстры нетак как надо переключаются на игроков, почему не работает рефлект у крузов...
Ведь мы же крутые программисты, заодно поможем мотровским в деле фикса багов, а?
-
mjaffk,
что-то немогу осилить график, 10.000 мобов => 0.01 но никак не 0.6.по данному емулятору РО (jAthena, eAthena) сеедится generator
только один раз при старте и используется при каждом подсчёте
вероятности.если мы говорим о 0.01, то нужно добавить, что данный прогноз
действует только, если один единственый человек на сервере.в иных случаях нужно вообще какой-нибуть другой прогноз.
например: 4.000-ным онлайном принудили rand() выдать единицу
(что будет 0.01), что будет очень хорошо. и тот счастливчик 1 из 4000
который заустил этот rand() либо получит success на его действие,
либо если был вызван rand() для просчёта вероятности падения
рарной шмотки(0.01), то упадёт рарная шмотка. один словом,
rand()=1 -> в любом случае повезло.вот терь интерессно было-бы узнать, какой персонаж, при каких
условиях, при каком online, при... больше всего запускает rand()? -
sivka, смотри. на 1м мобе 0.9999 шанс НЕуспеха (карточка -> 0.01% = 0.0001), на втором тоже. чтобы узнать общий шанс, нужно перемножить оба шанса, тогда выходит 0.9999*0.9999 или 0.9999^2. для 3х мобов соотв. 0.9999^3 и т.д. для 10000ного моба имеем 0.9999^10000 = 0,36786104643292992411133567221851 шанс неуспеха, или 0,63213895356707007588866432778149 шанс успеха, что и видно на графике.
остальное, что ты написал, я просто не в состоянии понять.
а лучше закроем тему, как предложил Мистикал, и пойдём покурим порингов, а?..
-
mjaffk,
аа... понял...спасибо, что разяснил
слушай примерно так и работает rand(), могу даже подтвердить
на практическом примере моего калькуляторав разделе RefineSIM результатов хуже 800% не получал,а если
это перевести на 0.01 -> 10.000, то будет где-то на 80.000 мобах
где-то 99.99% успеха я про это уже выше писал, правда там
брал 100.000 мобов (для страховки).если сам придумал формулу, то держи мой RESPECT
а то что ты как бы "не хочеш/не можеш" понять:
все берут в пример один генератор и один тип рарной шмотки
с вероятностью 0.01, а на самом деле то генератор один а
применяется генератор при любых просчётах вероятности.вот как мона работу генератора наглядней представить, надо ввести
такое понятие как цыкл. полный цыкл, это когда генератор выдаст
все числа от 1 до 10.000 для рарной шмотки. в худшем случае его
придётся запустить 80.000-100.000 раз, что и описывает твой график -
sivka, спасибо за респект :).. но что-то непонятное с генератором твоим и циклом...
есть 2 вида рандома вообще, рандом абсолютный и исключающий (названия сам придумал).
- абсолютный - это когда генерируются (неважно, каким способом) "левые числа" в промежутке от одного до другого, примерно так, как когда ты кидаешь кости. никакого цикла нету, полная, абсолютная халява, числа могут повторяться, могут не выпасть вообще
пример: rand(9) = 9 7 0 0 6 2 0 7 3 5 4 8 5 8 9 0 ...
- исключающий - это когда числа не могут повторяться. каждое число берётся "на халяву", но из тех чисел, что ещё не были выданы функцией (применяется в основном в плеерах). такие имеют цикл, длинна когорого равна кол-ву возможных вариантов
пример rand(9) = 0 6 3 9 4 5 7 2 8 1/6 9 2 4 6 0 7 5 1 8/...
а может, и ещё какие есть..
я, может туплю, но, насколько я понял, ты полагаешь, что в ро генератор второго типа.. то есть в любом случае когда-нибудь он выдаст заветную единичку.. но в ро он именно первого типа...
з.ы. Убир уже накурился =^________________^=
-
Генераторов "второго типа" не бывает. В теории вероятности такие задачи формулируются как "мешок с пронумерованными барабанами", и генератор "первого типа" есть генератор, т.е. он генерирует случайное число, а в "мешке" случайным является порядок вынимания барабанов, это НЕ генератор, в этих задачах генератор используется для получения номера по порядку барабана, а число на барабане - данность, условие, как "поезд двигается из точки А в Б".
Рандом дает числа от 0 до 1 не включая 1, поэтому говорить о целых числах, как вы понимаете, бессмысленно, их получают математическим преобразованием
floor(r)k+1, получаем числа от 1 до k включительно, floor - округление вниз.
Теперь внимание, если бесполезно говорить о выпадении целых чисел, то точно так же бесполезно говорить о выпадении чисел кратных 0.0001 и пр., это все получается матпреобразованием. Поэтому он не дает числа от 1 до 10.000, и гарантировать выпадение нужной шмотки раз на 10.000 мобов не будет.
Теперь почему "мешка" нет и не будет.
На сервере играет X людей (заведено игроков, речь не о текущем онлайне)
В игре бывает Y видов мобов
Из каждого моба падает в среднем Z типов шмота
На хранение инфы о том что уже выпало в что нет (какие числа в интервале от 1 до 10000 уже отработали или остались, что одно и то же) при отсутствии оптимизации потребуется
XYZ10.000 единиц памяти. При правильном подходе - по биту. Вот и прикидывайте...
И все это надо хранить, и немалую часть - ворочать в памяти рантайм...
А есть ведь еще steal...Я уж не говорю, что тема "мешка" тешит чувство жаждущих карты, и не более, а тема настоящего генератора соответствует жизни.
Периодически проскальзывают идеи о высеивании нового генератора. Пересеивать генератор не нужно вообще и никогда - один огромный ряд (2^24) чисел ничуть не лучше другого огромного ряда чисел.
@"sivka":
что мне ненравится: это указаные в базе-даннах droprate типа (0.01), она не соответствует фактическому дропу!Очень даже соответствует. При триллионе убитых мобов уложится с погрешностью 0.1%, я полагаю.
От безделья однажды накидал программу, моделирующую это. Где-то валяются результаты, если интерено могу поискать но ничего интересного там нет: дважды два всегда четыре, сколько не проверяй.@"mjaffk":
хардварный генератор случайных чисел О___ОА ты что думал? Тебя не удивляет хардварный генератор несущей частоты? А тиков 8-го прерывания? Почему бы его программно не получать? А из чего?
Кстати все ИНетовские казино на деньги используют хардвар. Типа ключа, тыкается в лпт-порт и генерит числа. Физика происходящего в ключе мне неизвестна. Мне довелось работать с казиношками, они там все очень даже в курсе - мне даже не пришлось боссам объяснять ничего о комп. генераторе случ. чисел, они сами все знали...@"mjaffk":
что сишная функция rand() иногда генерит как раз [0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ...]Она это будет генерить примерно с такой же вероятностью, как такое получается в жизни. Не будешь же ты оспаривать, что и в жизни ИНОГДА именно так и бывает?Насчет того что один воришка получает все а второму сильно не везет. На сервере за одну секунду происходят сотни процессов, требующих рандома. Перечислять их еще раз не буду. Поэтому можно сказать что каждому игроку достается некое подмножество ряда рандома. Я не могу этого доказать, но ИМХО если ряд рандома имеет, например, нормальное распределение, то любое достаточно большое случайно взятое подмножество элементов этого ряда имеет то же распределение. Более того, каждый игрок реализует разные процессы, требующие рандомов (удары, увороты, заточки, скиллы, дроп, етс), и для каджого отдельного вида таких процессов справедливо вышесказанное. Иначе карты падали бы реже, т.к. события малой вероятности выпадали бы как на дроп, так и на другие процессы (напр. уворот), и вероятность при дропе делилась бы на удельное отношение количества чисел для дропа против количества чисел для всего остального в сумме. Впрочем, если бы дело обстояло так, это было бы легко пофиксить изменением процента дропа (внутренним, не обязательно демонстрируемым игроку).
Господа, конечно рандом не идеально соответствует реальным "костям", но если он удовлетворителен для pgp и военных применений (дело лишь в длине ключа), то нашему РО и подавно хватит.
Вообще беседа оставляет ощущение какой-то сумбурности... рекомендую sivka на досуге покидать монетку, записывая наблюдения. Посмотреть динамику реального жизненного выпадения с вероятностью огромадных 50%. А потом применить этот опыт к картам и воришкам.
-
@"mjaffk":
но что-то непонятное с генератором твоим и циклом...да пожалуй придётся забыть про цыкл, так ка он описывает
конкретную последовательность событий. просто хотелось как-нибуть
обозначить повторение одного определнного числа.@"mjaffk":
насколько я понял, ты полагаешь, что в ро генератор второго типа.. то есть в любом случае когда-нибудь он выдаст заветную единичку.. но в ро он именно первого типа...
второй тип, тобой представленного генератора в худшем случае
на 10.000-ом запуске (в случае 0.01 вероятности) выдаст единицу.
неа, я имею в виду перваый тип, что когда-нибуть он выдаст
единицу (вероятность 0.01), на этом и закончится процесс подсчёта
вероятности, после чего можно начинать отсчёт вероятности по новой.что мне ненравится: это указаные в базе-даннах droprate типа (0.01), она не соответствует фактическому дропу!
@"Smolniy":
Очень даже соответствует. При триллионе убитых мобов уложится с погрешностью 0.1%, я полагаю.
тут я с тобой ни разу не согласен значит ты утверждаеш, что
0.01=100/10000! всё правильно, но только в РО это не
действительно, потому что один генератор просчитывает обсолютно
все вероятности, будь-то дабл-аттак или item с высокой droprate-ой
вероятность 0.01 может выпасть как в первом так и во втором случае,
а вот когда 0.01 по новой выпадет, при следующем запуске rand()
или при 100.000-ом запуске? по этой теории, обсолютно не реально
выбить что-либо одно спасает, что rand() запускается очень часто,
и 80.000-100.000 запусков rand() можно достичь и за одну минуту
(зависит от текущего online и интерактивности игроков).чтоб выбить карту вовсе не достаточно надеится на вероятность 0.01,
нуна молить генератор, чтоб он именно тебе и именно при просчёте
дропа рарной шмотки выкинул 0.01, а не соседу которому надо
просчитать будет он двойным или простым ударом битьresume:
ну вообще-то я могу смириться с 0.01 в дата-базе, если это считать
чисто теоретической droprate, которaя никаких выводов о
фактической droprate не даёт! на самом деле droprate должна по
более комплексной формуле высчитываться, чего нибуть такова:
Х=100/10000/online/дабл-аттак/refine/прочие итерацыий rand()
при чём Х может принят значение больше 0.01 или меньше 0.01 в
зависимости от online и интерактивности игроков.я всё, для меня тема раскрыта
-
Генераторов "второго типа" не бывает. В теории вероятности такие задачи формулируются как "мешок с пронумерованными барабанами", и генератор "первого типа" есть генератор, т.е. он генерирует случайное число, а в "мешке" случайным является порядок вынимания барабанов, это НЕ генератор, в этих задачах генератор используется для получения номера по порядку барабана, а число на барабане - данность, условие, как "поезд двигается из точки А в Б".
от того, что мы назовём сыр дырчатой массой, свойств своих он не потеряет. а теорию вероятности я не учил и не говорил я, что "мешок" есть..Рандом дает числа от 0 до 1 не включая 1, поэтому говорить о целых числах, как вы понимаете, бессмысленно, их получают математическим преобразованием
рандом даёт двоичное число, и как вы его будете определять - дело ваше. в компьютерах без математического сопроцессора вообще проблематично использовать числа с плавающей точкойиспытываю крайние сомнения в необходимости программы, доказывающей, что 0.01% = 0.01%....
о хардварном генераторе я просто не слышал, хотя и представлял его именно так, как вы описали ^^.. а какой у него принцип работы?насчёт сишной rand() и [0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ...].. это функция такая. она экстремально левая. при rand(1) иногда может выдавать именно такой ряд чисел. это обсуждалось на каких-то сишных форумах и т.п.
sivka, что-то ты загнул, сам себя и нас путаешь..
если положим, что числа действительно генерируются совершенно рандомно (а мы можем так полагать), то тебе достанется очень маленький кусочек вереницы чисел... но "твоя" вереница чисел будет настолько же разбросана, насколько будет и разбросаны и вереницы для остальных играков, да и насколько же, насколько разбросана главная, общая вереница чисел! можно даже сказать, что тебе даётся часть бесконечности (ведь ряд чисел бесконечен), но такая часть бесконечности - та же самая бесконечность! для тебя он-лайн и другие вероятности ничего, СОВСЕМ НИЧЕГО не меняют!система получает очередное число, и, если оно <= указанной вероятности, то выпадает карта. если указанная вероятность 0.01% и генератор генерирует рандмные числа, то указанное 0.01% будет и теоретической, и практической, и любой другой возможной вероятностью выпадания карточки-шмотки-лута! не понимаю тебя.
-
Всем ПРИВЕТ!!! Попробую развеять некоторые споры насчет шанс удачного дропа!!!
Попробуйте себе дома поставить сервак и поиграйте в одного, толку никакого,
но различия с тем же самым дропом заметите!!! -
@"Омега-Оружие":
Всем ПРИВЕТ!!! Попробую развеять некоторые споры насчет шанс удачного дропа!!!Попробуйте себе дома поставить сервак и поиграйте в одного, толку никакого,
но различия с тем же самым дропом заметите!!!