import random
def run_test(swings, trials, miss_chance):
base_miss_chance = 20
damage = 1.0
trial_max_damage = damage * swings
#initialize values calculated in trials
slowed_damage = 0.0 #average calculated on fly during trials
average_damage = 0.0
#tallys for keeping track of # of trials that damage reduction surpassed that of the slow and of 10% of base
damage_reduction_matched_slow = 0
damage_reduction_over_10 = 0
#TRIALS FOR SLOW + 20% MISS
slow_swings = int(float(swings)/1.1) #calculate number of swings made while slowed. int function rounds it off.
for trial in range(trials): #iterate trials
trial_damage = 0
for swing in range(slow_swings):
if hit(base_miss_chance):
trial_damage += 1.0 #add to trial damage if hit returns True
slowed_damage += trial_damage/float(trials) #trial's damage to the average for all trials
#TRIAL FOR 10% MISS AND 20% MISS
for trial in range(trials):
trial_damage = 0
for swing in range(swings):
if hit(miss_chance + base_miss_chance):
trial_damage += 1.0
#Check if the damage from the hit debuff trial matches the average from the slow debuff trials. If so, increment tally.
matched_slow = trial_damage <= slowed_damage
if matched_slow:
damage_reduction_matched_slow += 1
#Check if the additional (over base case) damage reduction from the hit debuff is >= 10% of base damage. If so, increment tally.
trial_diff = trial_max_damage * 0.8 - trial_damage
mached_10_percent = (trial_diff)/trial_max_damage >= 0.1
if mached_10_percent:
damage_reduction_over_10 += 1
#Add trial's damage to the average for all trials
average_damage += trial_damage / float(trials)
#PRINT RESULTS
print("Expected damage without debuffs: ", trial_max_damage * .8)
print("Damage reduction exceeded 10% of expected damage (80% hit, 0% slow) on", damage_reduction_over_10, " trials out of ", trials)
print("Damage reduction exceeded slow (80% hit, 10% slow) on", damage_reduction_matched_slow, " trials out of ", trials)
print("Net Percent Damage reduction from hit debuff (70% hit, 0% slow): ", ((1-average_damage/trial_max_damage)*100))
print("Net Percent Damage reduction from slow debuff (80% hit, 10% slow): ", ((1-slowed_damage/trial_max_damage)*100))
return
def hit(miss_chance):
'''Helper function. returns true if RNG results in a hit, false if not'''
return random.randrange(1, 101) > miss_chance
run_test(100,10000,10)
Comments