Супер! Особый респект за решение с площадями. Я что-то не додумался, пытался визуализировать с отрезками на линейке.
Проверял конечную формулу, прогоняя воспроизведенный алгоритм с рандомами по несколько миллионов раз для равномерного вычисления шанса. Фактические цифры могут различаются лишь сотыми долями процента в силу того, что статистически еще более ровное число получить показалось хлопотно. В случае с предыдущим случаем, расчетом шанса хака, все совпадало аналогично "на ура", поэтому считаю, что этот способ проверки формулы методом "прогона" можно считать правильным.
Результаты прогонов совпадают 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 не наблюдается. |