## Introduction

Axe’s win rate before and after 6.81 patch (29-th of April) |

“…where you manage to Berserker’s Call several enemies, you only have 3.2 seconds of being unconditionally hit by the enemy. In this time frame, the amount of successful Counter Helixes that use PRD is probably lower than with a true random. Hence the decrease in damage output and Win Rate.”

## Create a simulation to test the hypothesis

import random import numpy from tabulate import tabulate import collections <div> <div style="text-align: justify;"> Lets create functions to calculate number of Counter Helix PROCs for given number of hits using random and pseudo random approaches. First one will be using random approach (notice that random.randrange() actually generates pseudo random set of values)</div> <br /> def randHelixProc(hits): ''' checks if Counter Helix PROCs (chance = 17%) using random approach @param hits: number of times Axe was hit @return procs: number of times Counter Helix PROCs ''' procs = 0 for i in xrange(hits): chance = random.randrange(1, 101) if chance < 18: procs += 1 else: continue return procs

def pseudoRandHelixProc(hits): ''' checks if Counter Helix PROCs (chance = 17%) using pseudo random approach @param hits: number of times Axe was hit @return procs: number of times Counter Helix PROCs ''' treshold = 0 prob_list = [2, 5, 9, 14, 23, 47] # ~17% on average procs = 0 for i in xrange(hits): chance = random.randrange(1, 101) try: success = prob_list[treshold] except: success = prob_list[5] if chance >= success: treshold += 1 else: procs += 1 treshold = 0 return procs

rhelix_list = [] for i in xrange(100): value = randHelixProc(10000) rhelix_list.append(value) numpy.mean(rhelix_list) >>>1702.79 p_rhelix_list = [] for i in xrange(100): value = pseudoRandHelixProc(10000) p_rhelix_list.append(value) numpy.mean(p_rhelix_list) >>>1702.3

Output difference is negligible for random and pseudo random implementations.

Now its time to create a simulation function.

def simulation(times, hits): ''' Computes average number of PROCs for given hits for random and pseudo random approaches and difference between them. @param times: number of times simulation will run @param hits: number of hits to simulate @return: average difference in pocs between random and pseudo random approaches; table of simul results ''' # create lists of results diff_list = [] rand_mean_list = [] p_rand_mean_list = [] # run simulation for hit in xrange(1, hits + 1): rand_list = [] pseudo_rand_list = [] for t in xrange(times): rand = randHelixProc(hit) p_rand = pseudoRandHelixProc(hit) rand_list.append(rand) pseudo_rand_list.append(p_rand) # compute statistics and populate lists of results rand_mean = numpy.mean(rand_list) rand_mean_list.append(rand_mean) p_rand_mean = numpy.mean(pseudo_rand_list) p_rand_mean_list.append(p_rand_mean) diff = rand_mean - p_rand_mean diff = round(diff, 2) diff_list.append(diff) # print average difference in PROCs total_diff = sum(diff_list) l = len(diff_list) print 'average difference:', total_diff/l print '#######################################################################################################' # create table output for simulation results out_dict = {} out_dict['(1) cumulative hits'] = range(1, l + 1) out_dict['(2) random mean PROCs'] = rand_mean_list out_dict['(3) pseudo random mean PROCs'] = p_rand_mean_list out_dict['(4) difference'] = diff_list out_dict = collections.OrderedDict(sorted(out_dict.items())) print tabulate(out_dict, headers = 'keys', tablefmt="orgtbl")

Lets run 100 simulations of 100 consecutive hits. Of course it is possible to run 10000 hits but it is unnecessary since every time the Counter Helix is triggered we jump back to the first row from the table below (result of the simulation). As was already mentioned:

"[if] ...you manage to Berserker's Call several enemies, you only have 3.2 seconds of being unconditionally hit by the enemy"

If Axe was able to catch 3 enemies, together they will hit him about 9-12 times. This means that with the pseudo random approach he will spin 0.3-0.4 times less than with random approach. It will cause him to deal ~(205*0.35)*3 = 215,25 (or 71.75 per hero) less damage in engagement.

So the hypothesis was true - pseudo random approach caused the decrease in damage output on the short time interval even if total number of PROCs during the game stayed the same.

average difference: 0.34 ####################################################################################################### | (1) cumulative hits | (2) random mean PROCs | (3) pseudo random mean PROCs | (4) difference | |-----------------------+-------------------------+--------------------------------+------------------| | 1 | 0.17 | 0 | 0.17 | | 2 | 0.45 | 0.09 | 0.36 | | 3 | 0.56 | 0.12 | 0.44 | | 4 | 0.71 | 0.26 | 0.45 | | 5 | 0.81 | 0.36 | 0.45 | | 6 | 1.06 | 0.75 | 0.31 | | 7 | 1.37 | 0.88 | 0.49 | | 8 | 1.35 | 0.97 | 0.38 | | 9 | 1.47 | 1.22 | 0.25 | | 10 | 1.64 | 1.33 | 0.31 | | 11 | 1.95 | 1.65 | 0.3 | | 12 | 2.1 | 1.68 | 0.42 | | 13 | 2.36 | 1.79 | 0.57 | | 14 | 2.56 | 2.16 | 0.4 | | 15 | 2.61 | 2.26 | 0.35 | | 16 | 2.61 | 2.37 | 0.24 | | 17 | 2.87 | 2.43 | 0.44 | | 18 | 2.77 | 2.83 | -0.06 | | 19 | 3.22 | 2.84 | 0.38 | | 20 | 3.03 | 2.84 | 0.19 | | 21 | 3.6 | 3.22 | 0.38 | | 22 | 3.71 | 3.32 | 0.39 | | 23 | 3.68 | 3.68 | 0 | | 24 | 3.93 | 3.72 | 0.21 | | 25 | 4.54 | 3.92 | 0.62 | | 26 | 4.65 | 4.04 | 0.61 | | 27 | 4.47 | 4.27 | 0.2 | | 28 | 4.83 | 4.39 | 0.44 | | 29 | 4.78 | 4.48 | 0.3 | | 30 | 4.93 | 4.8 | 0.13 | | 31 | 5.3 | 4.92 | 0.38 | | 32 | 5.1 | 5.04 | 0.06 | | 33 | 5.79 | 5.34 | 0.45 | | 34 | 5.82 | 5.54 | 0.28 | | 35 | 6.04 | 5.52 | 0.52 | | 36 | 5.67 | 5.7 | -0.03 | | 37 | 6.64 | 5.98 | 0.66 | | 38 | 6.4 | 6.03 | 0.37 | | 39 | 6.72 | 6.41 | 0.31 | | 40 | 7.07 | 6.46 | 0.61 | | 41 | 7.04 | 6.59 | 0.45 | | 42 | 7.18 | 6.81 | 0.37 | | 43 | 7.08 | 6.9 | 0.18 | | 44 | 7.61 | 7.09 | 0.52 | | 45 | 7.72 | 7.21 | 0.51 | | 46 | 7.73 | 7.66 | 0.07 | | 47 | 8 | 7.68 | 0.32 | | 48 | 8.41 | 7.7 | 0.71 | | 49 | 8.57 | 7.93 | 0.64 | | 50 | 8.54 | 8.11 | 0.43 | | 51 | 8.16 | 8.31 | -0.15 | | 52 | 9 | 8.4 | 0.6 | | 53 | 9.01 | 8.79 | 0.22 | | 54 | 8.98 | 8.88 | 0.1 | | 55 | 9.54 | 8.99 | 0.55 | | 56 | 9.4 | 9.13 | 0.27 | | 57 | 9.75 | 9.08 | 0.67 | | 58 | 10.1 | 9.42 | 0.68 | | 59 | 9.71 | 9.64 | 0.07 | | 60 | 10.31 | 9.87 | 0.44 | | 61 | 10.19 | 10.31 | -0.12 | | 62 | 10.29 | 10.21 | 0.08 | | 63 | 10.76 | 10.55 | 0.21 | | 64 | 10.82 | 10.48 | 0.34 | | 65 | 10.7 | 10.77 | -0.07 | | 66 | 11.27 | 10.94 | 0.33 | | 67 | 11.81 | 11.06 | 0.75 | | 68 | 11.54 | 11.34 | 0.2 | | 69 | 11.98 | 11.26 | 0.72 | | 70 | 12.26 | 11.66 | 0.6 | | 71 | 11.35 | 12.01 | -0.66 | | 72 | 12.03 | 11.64 | 0.39 | | 73 | 12.37 | 11.94 | 0.43 | | 74 | 12.74 | 12.16 | 0.58 | | 75 | 13.16 | 12.66 | 0.5 | | 76 | 12.77 | 12.59 | 0.18 | | 77 | 13.1 | 12.65 | 0.45 | | 78 | 13.2 | 12.95 | 0.25 | | 79 | 13.59 | 13.06 | 0.53 | | 80 | 13.32 | 13.27 | 0.05 | | 81 | 13.74 | 13.25 | 0.49 | | 82 | 13.98 | 13.47 | 0.51 | | 83 | 14.86 | 13.74 | 1.12 | | 84 | 14.53 | 13.8 | 0.73 | | 85 | 14.54 | 14.29 | 0.25 | | 86 | 14.49 | 14.22 | 0.27 | | 87 | 15.03 | 14.46 | 0.57 | | 88 | 15.49 | 14.55 | 0.94 | | 89 | 15.51 | 14.8 | 0.71 | | 90 | 15.58 | 15 | 0.58 | | 91 | 16.17 | 15.01 | 1.16 | | 92 | 14.89 | 15.43 | -0.54 | | 93 | 15.73 | 15.4 | 0.33 | | 94 | 16.16 | 15.67 | 0.49 | | 95 | 16.11 | 16.17 | -0.06 | | 96 | 16.03 | 16.17 | -0.14 | | 97 | 16.41 | 16.07 | 0.34 | | 98 | 17.26 | 16.27 | 0.99 | | 99 | 15.65 | 16.7 | -1.05 | | 100 | 16.15 | 16.96 | -0.81 |