Перейти к содержанию

[NPC] Случайная заточка (испытай судьбу)


Рекомендуемые сообщения

[NPC] Случайная заточка v1.02

nt_randomrefine.png

Вступление

Выполнено по просьбе пользователя форума в этой теме.

Описание

Случайная заточка предметов из указанного списка с шансом сломать вещь (вещь ломается, а не удаляется навсегда, но если нужно, то можно удалить пару строк и предмет будет исчезать навсегда).

Скачать

Готовый NPC: nt_randomrefine.txt v1.02

Настройка

Все настройки прописываются в OnInit, разрешённые предметы прописывать в :

 setarray .allowed[0],1163,2280;

Прописан клеймор и саккат, если первым числом идёт 0, то будут допустимы все предметы. В будущем возможно добавление и списка deny предметов.

Цены на заточку:

 setarray .price[0],5000,5000,10000,15000,25000,50000;

Самая первая цена - для бронек, шапок и акссесуаров (у них всегда уровень 0).

Шанс поломать предмет:

 set .breakrate, 30;

от 0 до 100 (моё личное мнение: идеально всё-таки 50 и выше).

Для совместимости со старыми версиями афины и eA-Mod добавлены закомментированные строчки, искать в файле два места по:

// oldversion compatibility

Комментируем и снимаем блоки комментариев по необходимости.

Изменено пользователем wl.illusion
  • Upvote 7
  • Downvote 1
Ссылка на комментарий
Поделиться на другие сайты

goto yeah.png

Ну и rand(101)

вы один из тех огромных любителей даже для самых простых задач напихивать кучи ненужных конструкций из if/switch и создавать избыточность функций?

А rand(101) вполне к месту.

ps я по работе занимаюсь поддержкой чужих сорцов, костылей из кучи функций для вызова 1 раз за всё время работы и конструкций из 15-20 if/switch уже навидался. Спасибо, goto - идеальное решение.

Изменено пользователем wl.illusion
  • Upvote 1
  • Downvote 1
Ссылка на комментарий
Поделиться на другие сайты

А rand(101) вполне к месту.

И к какому же это месту тут 101?

Давно это 1/101 = 1%? :D

И насчет goto - даже в доках рафины есть про его использование.

Но конечно же ты самый умный :lol:

Ссылка на комментарий
Поделиться на другие сайты

И к какому же это месту тут 101?

Давно это 1/101 = 1%? :D

И насчет goto - даже в доках рафины есть про его использование.

Но конечно же ты самый умный :lol:

Неумение пользоваться goto не означает, что оно зло, все его боятся из-за риска создать цикличность, это кстати ещё в гайдах по Сям было написано, но вы то тоже самый умный и не читали их. А создание избыточных условий и функций для единственного вызова несут в себе куда большее зло, что в гайдах по тем же Сям имеется.

А бросание кубика сделано правильно, можно сделать, как в афине 10000, но статистически процент совпадения будет почти одинаковый, с разницей не превышающей ~5%, что допустимо (провренно написанием скрипта в 1000 запросов тем и другим методом), плюс сотые в нашем вопросе не нужны (они банально не используются, так зачем?). 101 = rand(0,100) (сорц script.c смотреть: max-min+1), но на выполнение у афины уходит меньше времени у запроса с одним входящим, так зачем попу рвать? Можно назвать не нужной оптимизацией.

И да, я очень умный, спасибо за комплимент :) но ещё я очень добрый и скромный, так что такие похвалы мне греют сердце.

Ссылка на комментарий
Поделиться на другие сайты

При использовании 'rand(101)' в итоге мы получаем 101 возможный результат, если при 10000 эту 1 ты и не заметишь, то при значении 100 это уже играет роль.

Хотя какая разница, может это задумка автора, чтоб шансов поболее было. =)

  • Upvote 1
  • Downvote 1
Ссылка на комментарий
Поделиться на другие сайты

При использовании 'rand(101)' в итоге мы получаем 101 возможный результат, если при 10000 эту 1 ты и не заметишь, то при значении 100 это уже играет роль.

Хотя какая разница, может это задумка автора, чтоб шансов поболее было. =)

Похоже документацию читал плохо не я, а кто-то другой, ну да ладно, вот что нам говорит официальная документация по скриптам:

rand(10)  would result in 0,1,2,3,4,5,6,7,8 or 9

проще говоря rand(101) даст результат в диапозоне от 0 до 100 включительно. И да, 0 - это тоже результат, который должен учитываться, так же как и 100, но это уже вопрос к некоторым особенностям высшей математики.

Изменено пользователем wl.illusion
Ссылка на комментарий
Поделиться на другие сайты

Сам себе противоречишь.

Давай по пальцам: rand()%10 вернет нам 10 возможных результатов, включая 0.


1 результат : 0
2 результат : 1
3 результат : 2
4 результат : 3
5 результат : 4
6 результат : 5
7 результат : 6
8 результат : 7
9 результат : 8
10 результат : 9

И естественно по той же схеме rand()%101 вернет нам 101 возможный результат.

Математик хренов.. <_<

Ссылка на комментарий
Поделиться на другие сайты

Сам себе противоречишь.

Давай по пальцам: rand()%10 вернет нам 10 возможных результатов, включая 0.

Математик хренов.. <_<

не путай кол-во результатов и значения, которые они дают - это ваша ошибка, в нашем случае нас интересуют _только_ значения.

ну и чтобы закрыть вопрос раз и навсегда:

rand100and101.png

Кубик кидается 10000 раз для каждого варианта, значения имеют приблизительные результаты разброса от желаемого. На картинке проверял шанс в 30%. Результаты для других шансов совпадают.

upd ps а, ну и я к вашим словам о том, что эта 1 имеет колосальное значение, с точки зрения математики результаты должны быть в диапозоне от 0 до 100, и думаю на этом вопрос можно закрыть, если вам лично не нравится эта 1, то исправьте для себя, мой учитель по вышке конечно бы на вас посмотре с укором, но вам есть до него дело?

Изменено пользователем wl.illusion
Ссылка на комментарий
Поделиться на другие сайты

Дополню отдельно по поводу тестового скрипта, личное наблюдение, при rand(101) флуктуации желаемого результата значительно ниже, чем при rand(100) - разброс значительно дальше уходит в обоих направлениях.

Ссылка на комментарий
Поделиться на другие сайты

Итак, я веру в местное сообщество малость потерял (без обид, это личное мнение), так что не думаю, что кто-то поймёт и вот эти данные (а тут кроме меня вообще кто-то проверят свои алгоритмы в стресс-тестах?):

rand100and101minmax.png

Для вас терпел пол миллиарда запросов (да это чертовски долго), суть картинки отображение максимальных и минимальныйх отклонений от желаемого значения (в нашем случае 30% от 10000 запросов), сейчас смотря на картинку некоторые двоечники потирают руки, глаза уже залились счастьем и сердцебиение зашкаливает от радости, что вот они же правы! Но нет, я не буду слишком вдаваться в подробности, но в среднем минимальное значение для rand(101) на 0.10% хуже, чем у rand(100), а вот максимальное значение в среднем у rand(101) лучше на 0.25%, чем у rand(100). По-сути, это настолько незначительные отклонения, что их разве что в астрономическом масштабе можно воспринимать серьёзно. Я не думаю, что за всё время жизни любого пиратского сервера кто-то вообще проделает столько запрососв, сколько было сделано мной в стресс-тесте.

Тем не менее итог: rand(101) даёт более точные результаты с отклонение шанса в худшую сторону, но в целом показатель на 0.15% для пол миллиарда запросов ближе к искомому значению, а значит на 750 000 запросов будет ближе к желаемому результату.

Объективный совет: хотите более честного подхода, тогда ваш выбор rand(101), хотите стабильного отклонения, то ваш выбор rand(100).

В рамках данного скрипта это роли особой не играет.

ps при увеличении значений (то есть rand(10000) и rand(10001) результат не меняется ни на сотую процента).

Изменено пользователем wl.illusion
Ссылка на комментарий
Поделиться на другие сайты

чем плох переход по лейбел?

Споры про goto так же сильны как споры о религии, почти любой форум по программированию забит срачами на тему, что goto это low и им нельзя пользоваться. Правда основные два тезиса, которые выдвигают противники goto мягко говоря сомнительны:

1. goto портит структурный вид кода

2. goto может создать dead infinity loop

Ну, если программист с руками из жопы, то конечно на один из этих пунктов он нарвётся, а то и на оба. На хабре было пару хороших статей в защиту goto и судя по выносу кармы крикунов о том, что goto зло - можно сказать, что большинство поддерживает умеренное использование явных переходов.

А так, вообще в любом даже крупном и крутом проекте используются goto. Парочка, но есть.

Ссылка на комментарий
Поделиться на другие сайты

Итак, я веру в местное сообщество малость потерял (без обид, это личное мнение), так что не думаю, что кто-то поймёт и вот эти данные (а тут кроме меня вообще кто-то проверят свои алгоритмы в стресс-тестах?):

rand100and101minmax.png

Для вас терпел пол миллиарда запросов (да это чертовски долго), суть картинки отображение максимальных и минимальныйх отклонений от желаемого значения (в нашем случае 30% от 10000 запросов), сейчас смотря на картинку некоторые двоечники потирают руки, глаза уже залились счастьем и сердцебиение зашкаливает от радости, что вот они же правы! Но нет, я не буду слишком вдаваться в подробности, но в среднем минимальное значение для rand(101) на 0.10% хуже, чем у rand(100), а вот максимальное значение в среднем у rand(101) лучше на 0.25%, чем у rand(100). По-сути, это настолько незначительные отклонения, что их разве что в астрономическом масштабе можно воспринимать серьёзно. Я не думаю, что за всё время жизни любого пиратского сервера кто-то вообще проделает столько запрососв, сколько было сделано мной в стресс-тесте.

Тем не менее итог: rand(101) даёт более точные результаты с отклонение шанса в худшую сторону, но в целом показатель на 0.15% для пол миллиарда запросов ближе к искомому значению, а значит на 750 000 запросов будет ближе к желаемому результату.

Объективный совет: хотите более честного подхода, тогда ваш выбор rand(101), хотите стабильного отклонения, то ваш выбор rand(100).

В рамках данного скрипта это роли особой не играет.

ps при увеличении значений (то есть rand(10000) и rand(10001) результат не меняется ни на сотую процента).

Каким образом при выборке из чисел <= 100(101) ты получаешь число выше границы?

Или что это за число и как оно считается

Изменено пользователем botka4aet
Ссылка на комментарий
Поделиться на другие сайты

чем плох переход по лейбел?


int a = rand()%100;
if (a>50) goto LOL;
int b=rand()%100;
LOL:
std::cout << a << b << std::endl;

Каким образом при выборке из чисел <= 100(101) ты получаешь число выше границы?

Или что это за число и как оно считается

суть картинки отображение максимальных и минимальныйх отклонений от желаемого значения (в нашем случае 30% от 10000 запросов)

Ссылка на комментарий
Поделиться на другие сайты

Наглядные графики и пояснения.

result_rand100-1ml.png

rand(1,100) и 1 миллион запросов, кучность неплохая.

result_rand101-1ml.png

rand(101) заметное смещение на 0.1% (да-да, ровно так выглядит смещение в 0.1%)

result_rand100-1billion.png

rand(1,100) и один миллиард запросов, по непонятным мне причинам разброс сглаживается и распределяется равномернее (результаты с отклонением выше 1.5% не учитывались при построение графика).

result_rand101-1billion.png

rand(101) и один миллиард запросов, на глаз определить разницу не удалось, но присутствует всё то же отклонение в -0.1%

использование rand(100) давало смещение в лучшую сторону:

result_rand100-1billion_2.png

на глаз это не сильно заметно, но смещение в сторону удачного выпадения есть на 0.13% на этом графике. В среднем смещение при rand(100) составляет +0.1% относительно rand(1,100).

Отсюда могу сделать только один вывод - используйте rand(1,100), остальные варианты дают смещение.


int a = rand()%100;
if (a>50) goto LOL;
int b=rand()%100;
LOL:
std::cout << a << b << std::endl;

наглядное пособие о жопоруком программисте, такие и без явных переходов наделают говна в коде (точнее оно уже есть в коде и без goto), тут если не читали гайды о правильном программирование, то о чём речь вообще?

Изменено пользователем wl.illusion
Ссылка на комментарий
Поделиться на другие сайты

суть картинки отображение максимальных и минимальныйх отклонений от желаемого значения (в нашем случае 30% от 10000 запросов)

Я не вижу на картинке число 30

Ссылка на комментарий
Поделиться на другие сайты

Я не вижу на картинке число 30

30 - это мнимый результат, можешь считать точку отсчёта на графиках этим значением.

да, подписывать графики мне было лень.

Ссылка на комментарий
Поделиться на другие сайты

Я не вижу на картинке число 30

30 - это мнимый результат, можешь считать точку отсчёта на графиках этим значением.

да, подписывать графики мне было лень.

Те ты используешь в качестве аргумента графики, основанные на высосанных из пальца числах?

Отличный подход

Ссылка на комментарий
Поделиться на другие сайты

Те ты используешь в качестве аргумента графики, основанные на высосанных из пальца числах?

Отличный подход

Ты же крутой программист :) возьми и напиши сам, или мне тебе ещё и скрипты выдавать? У меня на написание ушло чуть меньше часа, у такого спеца должно уйти не больше 5-10 минут.

Ссылка на комментарий
Поделиться на другие сайты

Ты же крутой программист :) возьми и напиши сам, или мне тебе ещё и скрипты выдавать? У меня на написание ушло чуть меньше часа, у такого спеца должно уйти не больше 5-10 минут.

Я спрашиваю у тебя формулу, а ты мне говоришь про время

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...
  • 4 месяца спустя...

[NPC] Случайная заточка v1.02

nt_randomrefine.png

Вступление

Выполнено по просьбе пользователя форума в этой теме.

Описание

Случайная заточка предметов из указанного списка с шансом сломать вещь (вещь ломается, а не удаляется навсегда, но если нужно, то можно удалить пару строк и предмет будет исчезать навсегда).

Скачать

Готовый NPC: nt_randomrefine.txt v1.02

Настройка

Все настройки прописываются в OnInit, разрешённые предметы прописывать в :

 setarray .allowed[0],1163,2280;

Прописан клеймор и саккат, если первым числом идёт 0, то будут допустимы все предметы. В будущем возможно добавление и списка deny предметов.

Цены на заточку:

 setarray .price[0],5000,5000,10000,15000,25000,50000;

Самая первая цена - для бронек, шапок и акссесуаров (у них всегда уровень 0).

Шанс поломать предмет:

 set .breakrate, 30;

от 0 до 100 (моё личное мнение: идеально всё-таки 50 и выше).

Для совместимости со старыми версиями афины и eA-Mod добавлены закомментированные строчки, искать в файле два места по:

// oldversion compatibility

Комментируем и снимаем блоки комментариев по необходимости.

А можно сделать так что бы в случае неудачной заточки, заточка падала на 1)

Например я точу пуху +8 и если неудачно она падает до 7ми)

и нужно добавить предмет, например что бы это точнуть принести надо неломайку)

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...
Яндекс.Метрика