Абордаж. Продолжение.
X3 Terran Conflict / X3 Земной конфликт
 
X3 Terran conflict  
 

На сайте онлайн (человек): 65



 



Абордаж. Продолжение.

Форумы: Terran Conflict (X3TC) / X3 Земной конфликт / Форум по игре X3 Terran Conflict (X3TC) / X3 Земной конфликт / Абордаж. Продолжение.Войти
Тема устарела

Количество: 2357
«<8990919293949596979899100101102103>»
Абордаж. Продолжение.
27.10.2013 11:33:15
eliseeff

Репутация: 25259
Сообщений: 18270
Регистрация: 08.05.2009
 Red_Eye писал(а):
Уже подсказали выше.
 

Вот выше-то подсказали правильно: в таблице - ошибочные данные. А ты сказал, что данные приведены для каждого из двух, что есть бред. Объяснить, в чем разница, и почему это бред, или сам поймешь?




Мдя... Вопросики полезут, как червячки... Надо будет посчитать, да поправить. Toor нечасто заходит.
27.10.2013 12:17:41
Red_Eye

Репутация: 1613
Сообщений: 1907
Регистрация: 12.06.2009
 eliseeff писал(а):
Вот выше-то подсказали правильно: в таблице - ошибочные данные.
 

А если перечитать внимательно все, что понаписано выше?
 eliseeff писал(а):
А ты сказал, что данные приведены для каждого из двух, что есть бред. Объяснить, в чем разница, и почему это бред, или сам поймешь?
 

Валяй. 

Димыч, если спешат/отстают часы, то это просто часы сбились, а не время во Вселенной скачет.

Раздел "бой" Трактата оперирует суммарным навыком группы, разделы "прорезка корпуса" и "взлом компьютера" говорят о навыках ОДИНОЧНОГО бойца.
Кстати, это можно понять из названий соответствующих граф таблицы - сравни три заголовка и скажи, сколько раз встретишь слово "суммарный":
- "Уровень механики, необходимый для 100% вероятности прорезания корпуса при заброске с M7M";
- "Суммарный боевой уровень, необходимый для 98% вероятности прохождения палубы без потерь";
- "Уровень хакинга, необходимый для 95% вероятности взлома компьютера".
27.10.2013 13:26:00
eliseeff

Репутация: 25259
Сообщений: 18270
Регистрация: 08.05.2009
 Red_Eye писал(а):
Валяй. 
 

Валяю.

Прорезка корпуса:

 
Считается уровень атаки, для этого суммируются навыки механики двух лучших механиков в группе.
 


Хак:

 
Рассчитывается показатель атаки, для этого суммируются навыки взлома двух лучших хакеров.
 


Теперь подумай, какой смысл приводить уровень для каждого, если они складываются. "Двое не ниже 60 каждый" и "не менее 120 в сумме" - это абсолютно разные вещи. Зачем путать юзера? Статья и так напряжная для освоения. Многабукафф, а что еще хуже - многацыфер, да еще и знаков между ними.

А как насчет варианта, когда в капсуле только один десантник? 60 (потолочное значение) - и он прорежется? Сам ведь знаешь, что нет. Складываться-то ему не с кем. Тогда зачем приводить данные для одного?

А как насчет того, что в навыке дробная часть отбрасывается? И пять на два не делится? (с) Зачем делить пополам и вводить дополнительную погрешность в вычисления?

Бред, бред, и еще раз бред.

Редактировалось 1 раз (а). Последний раз 27.10.2013 13:31:00.

27.10.2013 14:44:46
Red_Eye

Репутация: 1613
Сообщений: 1907
Регистрация: 12.06.2009
 eliseeff писал(а):
Бред, бред, и еще раз бред.
 

Не кипятись, не так все плохо.

Юзер не есть сферическая в вакууме категория.
Одного запутают раздельно показываемые навыки и необходимость складывать двоих, чтобы получить сумму, другого запутали бы суммы или необходимость делить сумму надвое, чтобы осознать каждого бойца по отдельности.

Вот - представь - учит неопытный игрок двоих хакеров для взлома _такого-то корабля_.
Может у него вопрос стоять так:"До каких цифр мне учить моих хакеров?"
Ни слова о сумме в вопросе - ни слова о сумме в ответе (в нашей таблице).
Тишь, покой, благодать.
Сам сообразит, что 2 по 60 равно 59 + 61, что 59 + 61 - это 60 в среднем. И если бы в таблице была дана сумма 120, ему один фиг пришлось бы осознавать, что 120 может быть набрано и как 2 по 60, и как 59 + 61.

 eliseeff писал(а):
Теперь подумай, какой смысл приводить уровень для каждого, если они складываются. "Двое не ниже 60 каждый" и "не менее 120 в сумме" - это абсолютно разные вещи. Зачем путать юзера? Статья и так напряжная для освоения. Многабукафф, а что еще хуже - многацыфер, да еще и знаков между ними.
 

Никакого смысла. Просто автор так решил.

Только вопрос у нас не в смыслах был изначально. А в том, сумма указана в таблице или не сумма.
Указана не сумма. Так решил автор таблицы.
Получилось не смертельно.
Если человек сумел осознать текст Трактата, тогда он сам досчитает до суммы. Если же текст пропущен как сложноватый для понимания, тогда пусть ориентируется на "не ниже 60 каждый" - так он точно попадет в "не менее 120 в сумме". Тем более, что такой пилот вообще мог не вычитать из текста, что работают ДВА хакера. Вот он был бы удивлен, пытаясь научить каждого своего солдата до табличных цифр, а в таблице были бы суммарные значения, частенько превосходящие 100.



В аццких ситуациях - взлом компа, например, земного М1 с файрволлом - сумма навыка двух хакеров тоже была бы ЗА пределами возможного для прокачки значения.
Это вызвано тем, что автор таблицы решил показать навык, потребный ИМЕННО ДЛЯ 50% вероятности взлома. Показывал бы он - на манер боевого раздела - "вероятность взлома макс.хакерами того же компа М1, усиленного доп.защитой" - мы видели бы просто какой-то % < 50, и такого веселого срача не сумели бы учинить.


К чему ты целочисленное деление приплел, я не совсем понял.
Видимо, тебе платят построчно.:lol:
27.10.2013 15:12:55
RusTer

Репутация: 3856
Сообщений: 3443
Регистрация: 17.11.2010
 eliseeff писал(а):
Бред, бред, и еще раз бред.
 
Дим, у Саши в "захват с помощью ТР" пару слов о навыках тоже есть. Можно, сравнив с таблицей, сделать вывод, что именно имел ввиду автор. Я тоже путаюсь постоянно, мне было б удобнее, если б везде речь шла о суммарных навыках. Но что есть, то есть.
27.10.2013 18:43:00
eliseeff

Репутация: 25259
Сообщений: 18270
Регистрация: 08.05.2009
 Red_Eye писал(а):
К чему ты целочисленное деление приплел, я не совсем понял.
Видимо, тебе платят построчно.:lol:
 

Однако, элементарно, Ватсон. Для М7:

HackingSecurity_base = 20
HackingSecurity_random = 30

Соответственно, DefenceLevel может принимать значения от 20 до 49. Отсюда, получаем навык для 50% = 34,5, для 95% = 49. В первом случае придется округлять до 34 или 35. Нет у нас дробных навыков. А если приводить значение для одного десантника, то мы получаем уже 17,25 в первом случае и 24,5 - во втором. И округлять придется уже оба полученных значения.

Мало того, округление до ближайшего целого в подобных случаях я не считаю корректным. И 17,25 надо округлять до 18, а не до 17. Ибо если задекларирован уровень, достаточный для N-% вероятности, то округлять можно исключительно в большую сторону.


А вот насчет построчной оплаты - это уже фимозец.
27.10.2013 20:09:41
boojum

Репутация: 2505
Сообщений: 1626
Регистрация: 20.08.2013
 eliseeff писал(а):
Мало того, округление до ближайшего целого в подобных случаях я не считаю корректным. И 17,25 надо округлять до 18, а не до 17.
 

Да тут как-то даже странно рассуждать о точности и округлениях, если минимальный навык рассматривается в контексте шансов. 50% - странная цифирь и на количество требующихся загрузок сейва она влияет, конечно, но так ли важен в данном случае сверхточный минимальный навык?

Если уж придираться, то почему есть таблица для 50% и 95%? Почему в названии "95%" включили общий для всех случаев 5% шанс обломаться, а для 50% нет? Несмотря на то, что в обоих случаях эти 5% не рассчитывались. Как бы все довольно приблизительно и зависит от контекста... Я потому сознательно и округлил шансы в табличке для не наглядных случаев. По честному, формулы есть, а вот способ наглядно донести результат - это другой вопрос. С тем, что в данном случае надо пессимистично округлять навык в большую сторону - согласен. Но лишь с целью донести.
27.10.2013 20:16:25
Red_Eye

Репутация: 1613
Сообщений: 1907
Регистрация: 12.06.2009
 eliseeff писал(а):
Однако, элементарно, Ватсон...
 

А-а, вот ты о чем.
Согласен, четко указанной вероятности успеха (например, 50%) часто буду соответствовать дробные показатели навыка.
С этой точки зрения выгоднее смотрелись бы цифры вероятности, посчитанные из навыка, а не наоборот.
Но автор решил показать так, а не иначе. Принимаем, благодарим, премся, премся с самих себя и своих вычислений.
 eliseeff писал(а):
А вот насчет построчной оплаты - это уже фимозец.
 

Он, он родимый.
29.10.2013 00:41:42
boojum

Репутация: 2505
Сообщений: 1626
Регистрация: 20.08.2013
Плохо быть двоешником... Хотелось бы все же уметь считать шанс хака с учетом известных 5% и 2%. Методом тыка и парой статистических моделек дотумкал до велосипедного преобразования.

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

Факт успешного взлома = (Предварительный_шанс% ИЛИ 2%) И НЕ 5%.

Можно это также выразить как (Предварительный_шанс || rand(100) < 2) && 5 <= rand(100).

Для простоты возьмем весьма абстрактный предварительный шанс 50%, по которому есть таблица в трактате.

2% рулетка крутится в случае, если хакеры совсем тупые или средненьким хакерам, как в данном случае, не повезло с DefenceLevel. Общая вероятность успеха слегка увеличивается:
шанс = шанс + (2% - шанс / 100% * 2%) = 50% + (2% - 50% / 100% * 2%) = 51%

С  5% вероятностью комп оживает в самом конце, общая вероятность уменьшается:
Общий_шанс = шанс - (шанс / 100% * 5%) = 51% - (51% / 100% * 5%) = 48.45%

Для наглядности табличка:
Предварительный шанс0%10%20%30%40%50%60%70%80%90%100%
Общий шанс1.9%11.21%20.52%29.83%39.14%48.45%57.76%67.07%76.38%85.69%95%

Сорри за дилетантский подход. Результаты проверял на миллионных прогонах формулки с рандомом для равномерного распределения. Прошу тех кто в теме, поправить или дополнить, если есть чем.

Редактировалось 3 раз (а). Последний раз 29.10.2013 06:04:06.

29.10.2013 11:59:08
eliseeff

Репутация: 25259
Сообщений: 18270
Регистрация: 08.05.2009
 boojum писал(а):
шанс = шанс + (2% - шанс / 100% * 2%) = 50% + (2% - 50% / 100% * 2%) = 51%
 

Такие записи слегка надрывают мозг наличием символа "%". Делить на сто процентов - это делить на единицу. И вообще формулы какие-то сумбурные, хотя результат в табличке, вроде, почему-то правильный.

Давай, попробуем свести все к понятным этапам.



1. Высчитываем AttackLevel, для чего тупо складываем (Hacking(1) + Hacking(2)), где Hacking(1 и 2) - уровни хакерства двух лучших хакеров. Этот показатель не изменяется. Рандом позже.


2. Высчитываем пределы DefenceLevel

DefenceLevel(min) = (HackingSecurity_base)
DefenceLevel(max) = (HackingSecurity_base + HackingSecurity_random -1)

Вот здесь и зарыт наш первый рандом. Весь этот промежуток {DefenceLevel(min) ... DefenceLevel(max)} составляет все наши 100% вероятности.


3. Теперь пора смотреть, а стоит ли нам вообще считать дальше. Если AttackLevel < DefenceLevel(min), то вероятность равна нулю, а если AttackLevel > DefenceLevel(max) - вероятность 100% и считать больше ничего не надо, первый промежуточный результат готов.


4. Если же нет - тогда начинаем считать.

Шанс успеха равен дроби, в числителе которой числовой промежуток успеха (AttackLevel - DefenceLevel(min)), а в знаменателе - все возможные случаи (DefenceLevel(max) - DefenceLevel(min)).

Чтобы привести его к процентному значению, следует, конечно, помножить это все на сто и приписать знак "%", но это пока не обязательно, ведь результат - промежуточный.




Итак, в п.3 или 4 мы получили первый промежуточный результат. Назовем его "пи с дужкой". Впрочем, звучит не очень хорошо. Назовем его просто Шанс(1).

Теперь будем считать шансы с учетом топора.


5. Топор у нас включается только в случаях неудачи. Это посчитать просто, достаточно лишь от единицы отнять Шанс(1) и помножить на 0,02, поэтому:

Шанс(2) = Шанс(1) + (1 - Шанс(1))*0,02 = Шанс(1) + 0,02 - 0,02*(Шанс(1)) = 0,98*(Шанс(1)) + 0,02

Нетрудно заметить, что проверять ничего не нужно, т.к. Шанс(2) никогда не вылезет за пределы единицы, т.е. максимальной вероятности.

Осталось только посчитать вероятность финального облома и прийти к окончательному результату.


6. Тут еще проще. В 5% случаев успеха мы все равно обломимся. Если мы не двоечники, то мы не станем отнимать 0,05, а умножим все на 0,95:

Шанс(3) = 0,95*Шанс(2)






А теперь, когда все достаточно просто и понятно, можно свести все к окончательному алгоритму и добавить в него модификаторы (брандмауэр, расы).


1. AttackLevel = (Hacking(1) + Hacking(2))


2. DefenceLevel(min) = (K(Race)*HackingSecurity_base)

    DefenceLevel(max) = (K(Race)*HackingSecurity_base + HackingSecurity_random - 1),

где K(Race) = 4 для землян и АОГ, 5 для ксенонов и 1 - для всех остальных.


3. Если есть ул. брандмауэр, то DefenceLevel(min & max) = DefenceLevel(min & max) +70


4. Если AttackLevel < DefenceLevel(min), то Шанс(1) = 0; goto 7


5. Если AttackLevel > DefenceLevel(max), то Шанс(1) = 1; goto 7


6. Шанс(1) = (AttackLevel - DefenceLevel(min)) / (DefenceLevel(max) - DefenceLevel(min))


7. Шанс(total) = 0.95*(0,98*(Шанс(1)) + 0,02) = 0.931*Шанс(1) + 0.019



Вот, в принципе, и все. В седьмом пункте я избавился от еще одного промежуточного значения Шанс(2). Оно нам без надобности, можно считать сразу окончательный результат.

Редактировалось 1 раз (а). Последний раз 29.10.2013 12:03:42.

29.10.2013 13:26:45
boojum

Репутация: 2505
Сообщений: 1626
Регистрация: 20.08.2013
Отлично!

В целом, как ни странно, та же фигня и сбоку бантик, но ты покрасивше написал, да. Разница лишь в том, что изначально я не стал сокращать и оптимизировать до коэффициентов, дабы в формулах светились заданные проценты шансов и можно было наглядно вытащить промежуточное. Поэтому и инвертирую 5%, а не умножаю на 0.95, хотя это вполне логично (но я все равно двоешник, терверов не кончали, формул не знаем, зато брутфорсим).

 eliseeff писал(а):
Такие записи слегка надрывают мозг наличием символа "%". Делить на сто процентов - это делить на единицу.
 
Это да, наверное, переборщил. Сто лет не оформлял что вот прям формулами да наглядно. Но "умножать на 100%" это частая фигня, вроде. В контексте приведения к процентам.



Тогда еще задачка! :lol:

Надо формулу для шанса прорезки корпуса. А конкретно - имея в качестве входных данных два числа (любых), которые "гуляют" +/-10%, получить шанс, что одно число больше другого.

29.10.2013 14:44:16
eliseeff

Репутация: 25259
Сообщений: 18270
Регистрация: 08.05.2009
 boojum писал(а):
Тогда еще задачка! :lol:

Надо формулу для шанса прорезки корпуса. А конкретно - имея в качестве входных данных два числа (любых), которые "гуляют" +/-10%, получить шанс, что одно число больше другого.
 

Наибольшая сложность пока вот в этой формулирровке:

> Показатели атаки и защиты меняются на случайную величину в пределах от -10% до +10% - 1.

Насколько я понимаю, она означает, что оба параметра изменяются от 0,9*Х до 1,1*Х с округлением вниз до ближайшего целого.

А может, я неправ и они не округляются? А просто +/- 10%, а потом еще минус один? А тогда "минус один" только от +10% или от -10% тоже?
29.10.2013 15:26:31
boojum

Репутация: 2505
Сообщений: 1626
Регистрация: 20.08.2013
 eliseeff писал(а):
А тогда "минус один" только от +10% или от -10% тоже?
 

Признаться, ни разу не видел в обже манипуляции с дробями :) Округления какие-то неявные присутствуют, конечно, при делении. Хз что получается при 5 / 2, скореее всего, обрубает вниз до целого. Наверное поэтому там часто для вычисления шансов используются выражения типа 5 <= rand(100). В том числе и от этого я по инерции отталкивался, когда пытался воспроизвести формулу.

Но речь не об этом. Та единичка получается по вине функции рандома. Алгоритм, насколько я вижу в коде, последовательно таков:

part = Defence / 10
Defence = Defence + SE_Random(part * 2) - part.

Но как мы знаем, функция SE_Random дает рандом от 0 до (аргумент - 1). То есть эти -1 идут вперед к +10%.
Например, при Defence = 100 получаем 100 + [0..19] - 10 = диапазон значений [90..109]

PS: Defence привел лишь для примера. С уровнем атаки аналогичная фигня. Свистопляски с рандомами это конечная фаза перед сравнением, все надбавки за расу и девайсы идут раньше, поэтому я их отбросил как несущественный в данном случае фактор.

Редактировалось 2 раз (а). Последний раз 30.10.2013 19:48:23.

29.10.2013 15:32:35
eliseeff

Репутация: 25259
Сообщений: 18270
Регистрация: 08.05.2009
 boojum писал(а):
part = Defence / 10
Defence = Defence + SE_Random(part * 2) - part.
 

Логично.

Сейчас поскриплю мозгами.
29.10.2013 16:31:26
propofol

Репутация: 0
Сообщений: 9
Регистрация: 29.10.2013
народ заранее прошу прощенья за тупой вопрос не могу купить десантников на фрегат сирокко да и любой другой ракетник они красные есть система жизни обеспечения.а на фантомах без проблем

Редактировалось 2 раз (а). Последний раз 29.10.2013 16:33:27.

29.10.2013 16:54:52
eliseeff

Репутация: 25259
Сообщений: 18270
Регистрация: 08.05.2009
 propofol писал(а):
народ заранее прошу прощенья за тупой вопрос не могу купить десантников на фрегат сирокко да и любой другой ракетник они красные есть система жизни обеспечения.а на фантомах без проблем
 

В Земном конфликте нет Фантомов. АР что ли? Так и иди в Абордажную тему АР. И свободное место в трюме ракетников проверь. Ибо если ты забил им трюмы ракетами под завязку, то десам просто влезть некуда.
30.10.2013 15:42:32
eliseeff

Репутация: 25259
Сообщений: 18270
Регистрация: 08.05.2009
 eliseeff писал(а):
Сейчас поскриплю мозгами.
 

Мдя...

Не столько сложен расчет, сколь трудно его объяснить без построения квадратиков. С квадратиками - все довольно просто, но, блин, рисовать их...


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

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

Ширина прямоугольника всегда равна (HullDefence(max) - HullDefence(min) + 1). Высота - (HullAttack(max) - HullAttack(min) + 1). А его площадь, соответственно, равна произведению ширины на высоту, а самое главное - это и есть количество всех возможных вариантов рандома на этом этапе, т.е это значение всегда будет нашим знаменателем в подсчете вероятности.

// Здесь и далее я сократил "Boarding" в своих названиях переменных, но смысл, думаю, понятен. Название переменной из таблицы, естественно, осталось без изменений.

Как же могут лежать эти прямоугольники? Я не придерживался пропорций, но схематично это выглядит примерно так (примерно в порядке сложности расчета):



Вариант 1. Удача стопроцентная, все поют и пляшут. Происходит, если HullAttack(min) больше или равно HullDefence(max). Считать ничего не нужно, Шанс = 100%.






Вариант 2. Гарантированный провал. Пичалька, переходящая в горюшко. Происходит, когда HullDefence(min) превышает HullAttack(max). Считать снова ничего не нужно, Шанс = 0.






Вариант 3. Квадрат. Происходит, когда HullDefence = HullAttack. Соответственно, минимальный и максимальный показатели у них тоже совпадают, поэтому считать можно только один из них, а подсчет вероятности совсем прост.








Варианты 4 и 5. Вот здесь будет уже посложнее, чем с квадратиком, но все равно ненамного. Мы с этим справимся.




Итак, с чего мы начнем, чтобы не делать лишних телодвижений? Прежде всего следует посчитать расовые и прочие модификаторы для базовых значений атаки и защиты. Берем из таблицы BoardingHullDefence, если земляне или АОГ, то удваиваем, а в случае наличия поляризатора еще и увеличиваем на 150. Полученное значение назовем HullDefence.


Теперь складываем механику двух лучших механиков и, если они в аб. капсуле, удваиваем результат. Результат назовем HullAttack.


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


HullDefence(min) = HullDefence - [0.1*HullDefence]
HullDefence(max) = HullDefence + [0.1*HullDefence] - 1


ОК. Теперь сравниваем HullDefence с HullAttack. Если они равны, то все просто. Мы получили наш квадрат из первого варианта. Главное - не забывать, что это все-таки не геометрия, а квадрат - числовой.


Довольно неплохо это проиллюстрирует довольно простая табличка:

55:15:25:35:45:5
44:14:24:34:44:5
33:13:23:33:43:5
22:12:22:32:42:5
11:11:21:31:41:5
Атака/Защита12345



Сколько здесь наших непроигранных результатов (ничья ведь в нашу пользу)? Да очень просто. Посчитаем А = (Атака(max) - Атака(min) + 1). Тогда наш искомый икс равен ((А2 - А) / 2 + А). А всего сколько "розыгрышей" было? А2. И какова в итоге вероятность не проиграть? ((А2 - А) / 2 + А) / А2)



Вот так и считаем: А = (HullDefence(max) - HullDefence(min) + 1)

Шанс = ((А2 - А) / 2 + А) / А2) = ... = (A + 1) / (2 * A)

И все-таки ничто мне не заменит листок бумаги с карандашом. Посидел, помусолил и упростил...




Если же HullDefence не равен HullAttack, то нам придется уже считать пределы изменения атаки.


HullAttack(min) = HullAttack - [0.1*HullAttack]
HullAttack(max) = HullAttack + [0.1*HullAttack] - 1


Теперь следует определить, что все-таки больше, атака или защита и исходя из этого плясать дальше.


Если HullDefence больше HullAttack, то:


Если HullDefence(min) > HullAttack(max), то Шанс = 0; end (not happy)
Если HullDefence(min) =< HullAttack(max), то переходим к этапу "считаем треугольнички" (далi буде)


Если HullDefence меньше HullAttack, то:


Если HullAttack(min) >= HullDefence(max), то Шанс = 100%; [happy]end
Если же HullAttack(min) < HullDefence(max), то опять-таки переходим к этапу "считаем треугольнички" (далi буде)






А теперь, как и было обещано, считаем треугольнички.





Прямоугольники у нас хоть и не являются квадратами, но отсекаемый треугольник всегда является, так сказать, "равносторонним". И считается почти так же, как мы считали в свое время квадрат. Разница лишь в том, что в одном случае у нас треугольник (включая диагональ) является успехом, а в другом (исключая диагональ) - провалом. Начнем с первого.





Итак, если HullDefence больше HullAttack, то мы видим следующую картинку:



Несложно догадаться, что сторона треугольника равна:


А = (HullAttack(max) - HullDefence(min) + 1)


Площадь прямоугольника равна:


S = (HullDefence(max) - HullDefence(min) + 1) * (HullAttack(max) - HullAttack(min) + 1)


Тогда вероятность успеха у нас в этом случае:


Шанс = ((А2 - А) / 2 + А) / S = ... = (А2 + А) / (2 * S)





Теперь рассмотрим случай, когда HullDefence меньше HullAttack.



Здесь у нас сторона треугольника равна:

А = (HullDefence(max) - HullAttack(min) + 1)


Площадь прямоугольника по-прежнему:


S = (HullDefence(max) - HullDefence(min) + 1) * (HullAttack(max) - HullAttack(min) + 1)


А вероятность успеха:


Шанс = (S - (А2 - А) / 2) / S = ... = 1 - ((А2 - А) / (2 * S))

Редактировалось 9 раз (а). Последний раз 30.10.2013 23:54:38.

30.10.2013 20:59:29
boojum

Репутация: 2505
Сообщений: 1626
Регистрация: 20.08.2013
Супер! Особый респект за решение с площадями. Я что-то не додумался, пытался визуализировать с отрезками на линейке.

Проверял конечную формулу, прогоняя воспроизведенный алгоритм с рандомами по несколько миллионов раз для равномерного вычисления шанса. Фактические цифры могут различаются лишь сотыми долями процента в силу того, что статистически еще более ровное число получить показалось хлопотно. В случае с предыдущим случаем, расчетом шанса хака, все совпадало аналогично "на ура", поэтому считаю, что этот способ проверки формулы методом "прогона" можно считать правильным.

Результаты прогонов совпадают c твоей конечной формулой, кроме одной ситуации: когда HullAttack < HullDefence. Тогда получаются серьезные расхождения почему-то.

Например при HullAttack = 37 и HullDefence = 40 по формуле получаем 12.33%. А прогон алгоритма дает фактический шанс 20.8%
Или при HullAttack = 195 и HullDefence = 200 по формуле шанс 22.63%. По факту выдает 39.14%.

В случае же, когда HullAttack >= HullDefence, все ништяк.

В общем, либо где-то косяк в конечной формуле, либо вступил в силу какой-то эффект, связаный с нюансами алгоритма, те же неявные округления, например. Я их тоже пытался воспроизвести, учитывая, что в оригинале кода используется только целочисленная арифметика. Еще уточню, не исключено, что и я где-то насажал блох в модели.

Еще момент не понял:
 eliseeff писал(а):
HullDefence(min) = HullDefence - |0.1*HullDefence| // значение модуля числа, думаю, понятно
HullDefence(max) = HullDefence + |0.1*HullDefence| - 1 // аналогично
 
Какой смысл здесь имеет модуль? Параметры заведомо не могут быть меньше нуля.

 eliseeff писал(а):
То не модуль, а склероз целая часть числа.
 
Может имеет смысл чуть попроще, типа: HullDefence * 0.9 ? Туплю. Один хрен. Правильнее было бы воспроизвести как в алгоритме, конечно. Либо не затрагивать округления вообще

Хотя, ты прав, конечно - больше неявных округлений в этом куске быть не может. Делений кроме как аргумента на 10 не наблюдается.

Редактировалось 4 раз (а). Последний раз 30.10.2013 21:52:02.

30.10.2013 21:02:54
eliseeff

Репутация: 25259
Сообщений: 18270
Регистрация: 08.05.2009
 boojum писал(а):
Какой смысл здесь имеет модуль? Параметры заведомо не могут быть меньше нуля.
 

Извини. То не модуль, а склероз целая часть числа. Сейчас поправлю.

С HullAttack < HullDefence сейчас еще гляну. Может, где блоху пропустил.

Редактировалось 1 раз (а). Последний раз 30.10.2013 21:08:42.

30.10.2013 21:51:43
eliseeff

Репутация: 25259
Сообщений: 18270
Регистрация: 08.05.2009
 boojum писал(а):
Например при HullAttack = 37 и HullDefence = 40 по формуле получаем 12.33%. А прогон алгоритма дает фактический шанс 20.8%
 

HullAttack(max) = 37 + [3.7] - 1 = 39
HullAttack(min) = 37 - [3.7] = 34

HullDefence(max) = 40 + [4] - 1 = 43
HullDefence(min) = 40 - [4] = 36

S = (39 - 34 + 1) * (43 - 36 + 1) = 6 * 8 = 48
A = (39 - 36 + 1) = 4

Шанс = (42 + 4) / (2 * 48) = 20 / 96 = 0.2083333... (~20.8%)

 boojum писал(а):
Или при HullAttack = 195 и HullDefence = 200 по формуле шанс 22.63%. По факту выдает 39.14%.
 


HullAttack(max) = 195 + [19.5] - 1 = 213
HullAttack(min) = 195 - [19.5] = 176

HullDefence(max) = 200 + [20] - 1 = 219
HullDefence(min) = 200 - [20] = 180

S = (219 - 180 + 1) * (213 - 176 + 1) = 40 * 38 = 1520
A = (213 - 180 + 1) = 34

Шанс = (342 + 34) / (2 * 1520) = 1190 / 3040 = 0,39144736... (~39,14%)




Результаты подсчета по формуле совпадают с твоими фактическими. Ошибка где-то у тебя.

Редактировалось 1 раз (а). Последний раз 30.10.2013 21:58:30.

«<8990919293949596979899100101102103>»


Список игр