Генератор случайных чисел и дроп карт.
-
@"mjaffk":
Smolniy1 тогда эти последовательности можно повторить, если использовать те же константы.. бред..
2 всегда не любил си =)асм рулит, таймер рулит
3 умножь таймер на минуты на часы на секунды, добавь х курсора и у курсора и отними температуру процессора, и возведи это в степень (1+№ вызова функции) div 10, что ещё нужно?
4 текст не читал, лениво- Вообще-то, не совсем, что довольно странно. Об этом есть в тексте
- Си тут ни при чем, это вообще так принято во всех языках. Это вообще математическая проблема, не компьютерная.
- За одну секунду при неподвижном курсоре на сервере вывалится 1к райдриков
Ах да, счетчик функций... Короче, я надеюсь ты сам понимаешь, что это бардак. - Да я так предложил, для общего развития...
-
- rtfm насчёт таймера. таймер не часы! это совершенно отдельное устройство, работающее незваисимо ото всех остальных, которое изменяет значение одного слова! можно замкнуть на встроенный динамик, тогда он будет издавать звук (так в 99% случаев программируют встроенный динамик, можно ещё вручную подавать-снимать ток с динамика, но это маразм. я сам писал музыку на втроенном динамике и знаю это всё прекрасно;)). частота у таймера может быть такая, что динамик становится неслышным (ультразвук), и этой частоты достаточно для любых выпаданий карт и пр.. пока процессор выполнит одну команду и перескочит на другую, таймер уже на большую цифирку изменит значиние того заветного слова)
-
- Что-то я тебя не пойму. То ты говоришь про минуты и секунды (логичн предположить что суперслово "таймер" подразумевает часы), то про железяку
- Я могу ошибаться, но это то что берется 8-м прерыванием? Так оно работает с частотой раз в 55 миллисекунд (18.(18) Гц), откуда тут взяться инфразвуку???
- Если ты говоришь о счетчике тактов процессора, то и говори о счетчике тактов процессора, а не о "таймере".
- В любом раскладе, в твоей формуле сплошные арифм. прогрессии - что "таймер", что "время", что "номер вызова функции", любая математика с ними будет той же прогрессией, арифм. или геом.. Координаты курсора изменяются во вполне конкретных пределах, плюс к тому они весьма дискретны. Температура из той же области. Такой генератор никому бесплатно не нужен.
- Ты, я уверен, понимаешь, что игрушки - далеко не самая денежная и не самая важная область, где нужны генераторы случайных чисел. Криптография, оборонка, наука... Просто математика в принципе не дает необходимого матаппарата.
-
ай, ну вас.
таймер не часы и вообще это совсем разные вещи. работают отдельно и т.п. я не помню его аппаратного прерывания (мой старый компьютер давно сдох, а с ним всё, что у меня было написано, книжки дал почитать, записи потерял), а простым прерыванием (если это и можно) программировать будут его только анацефалы.. программируется он напрямую выводом-вводом в порты (есть такие никому неизвестные внутренние порты, для доступа к периферии) 61h и 42h (если верить яндексу, но вроде как правильные.. что-то помню еще). откуда 55 миллисекунд - я не знаю, но частоты там можно самому свои устанавливать.. не помню я всего этого.а какой был бы идеальный генератор случайных чисел?.. блондинки отпадают.
з.ы. нашёл пример, вроде то.. правда, насчёт частоты ничего сказать не могу:
[code:nhpswxwk] model tiny
.code
org 100hStart:
; Тестовый пример:; Восходящая гамма: mov ax, 100 mov cl, 0
M1: call Sound ; Звучание с новой частотой, кратной 100Гц.
push ax
mov ax, 200 ; Задержка звучания на 200 мс.
call Delay
pop ax
add ax, 100 ; Новая частота.
inc cl ; Завершение цикла.
cmp cl, 10
jb M1
; Нисходящая гамма:
M2: call Sound ; Звучание с новой частотой, кратной 100Гц.
push ax
mov ax, 200 ; Задержка звучания на 200 мс.
call Delay
pop ax
sub ax, 100 ; Новая частота.
dec cl ; Завершение цикла.
cmp cl, 0
ja M2
; Выключаем звук:
call NoSoundret ; Описание вспомогательных подпрограмм:
Sound proc
; Включает воспроизведение звука встроенным динамиком с частотой AX герц.
push ax
push dx
push cx
; Программирование таймера:
mov al, 10110110b ; Будем программировать канал 2 (отвечает за
; динамик) с настройкой двумя байтами (сначала
; маладший, затем старший) в режиме генерации
; прямоугольных импульсов, подаваемых на
; динамик.
out 43h, al
; Определяем делитель частоты: X = 1 193 180 / AX(наша частота, Гц)
mov cx, ax ; Сохраняем частоту в CX.
mov dx, 12h
mov ax, 34DCh ; DX:AX = 1 193 180
div cx
; Записываем делитель частоты в порт 42H (он имеется в AX)
out 42h, al
mov al, ah
out 42h, al
; Включаем звук, установив биты 0 и 1 в порте 61h в 1.
in al, 61h
or al, 00000011b
out 61h, alpop cx pop dx pop ax ret
Sound endp
NoSound proc
; Выключает воспроизведение звука встроенным динамиком.
; Просто обнуляем биты 0 и 1 в порте 61h.
in al, 61h
and al, 11111100b
out 61h, al
ret
NoSound endpDelay proc
; Реализует задержку выполнения программы на AX миллисекунд.
push ax
push dx
push cx
mov dx, 0 ; Переводим миллисекунды в микросекунды,
mov cx, 1000 ; (умножая содержимое AX на 1000),
mul cx ; т.к. функция задержки работает с мкс.
mov ah, 86h ; Установить задержку в микросекундах.
mov cx, dx ; Старшее слово числа.
mov dx, ax ; Младшее слово числа
int 15H ; Вызов BIOS
pop cx
pop dx
pop ax
ret
Delay endpend Start [/code:nhpswxwk]
-
Если б ты ссылку по диагонали пробежал, такого вопроса бы не было
Идеальный генератор случайных чисел был бы у физиков. Например, генератор каких-нить частиц с измерялкой. Кстати, мыслил ты с температурой процессора в правильном направлении- просто это решение зависит от камня, а надо математическое решение.Физическое моделирование случайности с помощью таких физических явлений, как радиоактивное излучение, дробовой шум в электронной лампе или туннельный пробой полупроводникового стабилитрона не дают настоящих случайных процессов. Хотя известны случаи удачных применений их в генерации ключей, например, в российском криптографическом устройстве КРИПТОН. Поэтому вместо физических процессов для генерации гаммы применяют программы для ЭВМ, которые хотя и называются генераторами случайных чисел, но на самом деле выдающие детерминированные числовые ряды, которые только кажутся случайными по своим свойствам. От них требуется, чтобы, даже зная закон формирования, но не зная ключа в виде начальных условий, никто не смог бы отличить числовой ряд от случайного, как будто он получен бросанием идеальных игральных костей
А квотинг твой, имхо, лишний. Прости, это не мануал и не пояснение.
-
думали про таймер - вот он вам и таймер.
"выдающие детерминированные числовые ряды, которые только кажутся случайными по своим свойствам. От них требуется, чтобы, даже зная закон формирования, но не зная ключа в виде начальных условий, никто не смог бы отличить числовой ряд от случайного, как будто он получен бросанием идеальных игральных костей"..
это никуда не годится.. особенно так, как это реализовано в ро. самое интересное - наблюдать двойные удары воришек. так, можно сделать 30-40 ударов подряд совершенно без двойного удара и наоборот.
дело в том, что генератор случайных чисел, приведённый выше, работает вне зависимости от внешних условий, то есть, числа будут совпадать и вообще ряд чисел будет предопределён (какая ж это случайность?).. а в "моей" функции внешним фактором служит процессорное время, а на него влияет очень многое, начиная от температуры в комнате и кончая скоростью соединения Васи Пупкина из Смольного.
можно, конечно, использовать и ваш метод, но тогда нужно как можно меньше инициировать поток чисел или инициировать возрастающими, разными числами.. ну и формула нужна нормальная.
я дурак, не судите строго
-
интел уже давным давно делает в своих чипсетах хардварный генератор случайных чисел (на тепловом шуме вроде)
но всё это фигня
т.к. спак упёрся в сверхстабильную-и-неглючную жопену и на еАфину и смотреть не хочет.
а разработчики жопены похоже ни с кем не общаются. -
хардварный генератор случайных чисел О___О
-
и чем вам rand() ненравится? работает отлично, раскидывает цыфры
просто фантастика есть правдо погрешность в положительную
сторону ну да и фиг с ней, нам от этого не хужечто мне ненравится: это указаные в базе-даннах droprate типа (0.01),
она не соответствует фактическому дропу! как на данный момент
генератор случайны чисел имплементирован и работает, стоило бы
писать вместо 0.01 просто неизвестно.повторяю: чтоб делать прогнозы типа 0.01, надо чтоб и генератор
работал именно по одному типу шмотки! -
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 шанс успеха, что и видно на графике.
остальное, что ты написал, я просто не в состоянии понять.
а лучше закроем тему, как предложил Мистикал, и пойдём покурим порингов, а?..