| 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). Оно нам без надобности, можно считать сразу окончательный результат. |