def get_winrates(user_id_1: int, user_id_2: int, ndchar: NDChar, amplified: bool) -> tuple or None:
stats_1 = await get_character_stats(user_id_1, ndchar, amplified)
stats_2 = await get_character_stats(user_id_2, ndchar, amplified)
if not stats_1.has_wins or not stats_2.has_wins:
return None
m2_minus_m1 = stats_2.mean - stats_1.mean
sum_var = stats_1.var + stats_2.var
erf_arg = m2_minus_m1 / math.sqrt(2*sum_var)
if m2_minus_m1 > 0:
winrate_of_1_if_both_finish = (1.0 + math.erf(erf_arg))/2.0
else:
winrate_of_1_if_both_finish = (1.0 - math.erf(-erf_arg))/2.0
both_finish_prob = stats_1.winrate * stats_2.winrate
neither_finish_prob = (1-stats_1.winrate)*(1-stats_2.winrate)
winrate_of_1 = winrate_of_1_if_both_finish*both_finish_prob + (stats_1.winrate - both_finish_prob)
winrate_of_2 = (1.0-winrate_of_1_if_both_finish)*both_finish_prob + (stats_2.winrate - both_finish_prob)
return winrate_of_1, winrate_of_2, neither_finish_prob
评论列表
文章目录