import random
from statistics import median
N = 100000 # Set this to the number of simulated rolls to aggregate
def d20(luck=False):
result = random.randint(1, 20)
if luck and result == 1:
result = random.randint(1, 20)
return result
def count_20s(lst):
count = 0
for ele in lst:
if ele == 20:
count = count + 1
return count
def median_roll(rolls):
return median(rolls)
def ratio_crits(rolls):
return round((count_20s(rolls) / N) * 100)
def average_triple_advantage(luck=False):
rolls = []
for _ in range(N):
ea_roll = [max(d20(luck), d20(luck)), d20(luck)]
rolls.append(max(ea_roll))
return [median_roll(rolls), ratio_crits(rolls)]
def average_advantage(luck=False):
rolls = [max(d20(luck), d20(luck)) for x in range(N)]
return [median_roll(rolls), ratio_crits(rolls)]
def average_disadvantage(luck=False):
rolls = [min(d20(luck), d20(luck)) for x in range(N)]
return [median_roll(rolls), ratio_crits(rolls)]
def average_of_d20(luck=False):
rolls = [d20(luck) for x in range(N)]
return [median_roll(rolls), ratio_crits(rolls)]
print("Median roll with EA is {0} and {1}% are crits.".format(*average_triple_advantage()))
print("Median roll with Adv is {0} and {1}% are crits.".format(*average_advantage()))
print("Median roll on 1d20 is {0} and {1}% are crits.".format(*average_of_d20()))
print("Median roll with DisAdv is {0} and {1}% are crits.".format(*average_disadvantage()))