Last active
May 10, 2017 03:31
-
-
Save david-wm-sanders/6fb2024779b339412b2731685bc69bc3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import random | |
import statistics | |
import sys | |
def d(x): | |
return random.randint(1, x) | |
def droplow_4d6(): | |
dice = [d(6), d(6), d(6), d(6)] | |
dice.sort() | |
dice = dice[1::] | |
return sum(dice) | |
def droplow_4d6_rr1(): | |
dice = [] | |
while not len(dice) == 4: | |
x = d(6) | |
if x != 1: | |
dice.append(x) | |
dice.sort() | |
dice = dice[1::] | |
return sum(dice) | |
def strict_3d6(): | |
return sum([d(6), d(6), d(6)]) | |
def sixplus_2d6(): | |
return sum([6, d(6), d(6)]) | |
def sixplus_droplow_3d6(): | |
dice = [d(6), d(6), d(6)] | |
dice.sort() | |
dice = dice[1::] | |
return sum(dice) + 6 | |
def droplow2_5d6(): | |
dice = [d(6), d(6), d(6), d(6), d(6)] | |
dice.sort() | |
dice = dice[2::] | |
return sum(dice) | |
rule_map = {"droplow_4d6": droplow_4d6, | |
"droplow_4d6_rr1": droplow_4d6_rr1, | |
"strict_3d6": strict_3d6, | |
"sixplus_2d6": sixplus_2d6, | |
"sixplus_droplow_3d6": sixplus_droplow_3d6, | |
"droplow2_5d6": droplow2_5d6} | |
def roll_stats(rolling_rule): | |
return [rolling_rule() for x in range(6)] | |
points = {3: -5, 4: -4, 5: -3, 6: -2, | |
7: -1, 8: 0, 9:1, 10: 2, | |
11: 3, 12: 4, 13: 5, 14: 7, | |
15: 9, 16: 11, 17: 14, 18: 17} | |
def calc_point_buy_eq(stats): | |
return sum(points[x] for x in stats) | |
def main_roll_stats(rolling_rule): | |
rule = rule_map.get(rolling_rule, None) | |
if rule: | |
stats = roll_stats(rule) | |
pbe = calc_point_buy_eq(stats) | |
print("Ability Scores: {0}, pbe = {1}".format(stats, pbe)) | |
else: | |
print("Rolling rule '{0}' not found.".format(rolling_rule)) | |
def main_calc_avg(rolling_rule): | |
rule = rule_map.get(rolling_rule, None) | |
if rule: | |
pbes = (calc_point_buy_eq(roll_stats(rule)) for x in range(100000)) | |
avg = statistics.mean(pbes) | |
print("Average pbe for rolling rule '{0}' is {1}".format(rolling_rule, avg)) | |
else: | |
print("Rolling rule '{0}' not found.".format(rolling_rule)) | |
def main_check27(rolling_rule): | |
rule = rule_map.get(rolling_rule, None) | |
if rule: | |
xlt27, xeq27, xgt27 = 0, 0, 0 | |
pbes = (calc_point_buy_eq(roll_stats(rule)) for x in range(100000)) | |
for pbe in pbes: | |
if pbe < 27: | |
xlt27 += 1 | |
elif pbe == 27: | |
xeq27 += 1 | |
elif pbe > 27: | |
xgt27 += 1 | |
else: | |
print("Natural 1 on Tinkering skill check!") | |
print(f"pbe>27: {xgt27/1000:4.1f}%, pbe=27: {xeq27/1000:4.1f}%, pbe<27: {xlt27/1000:4.1f}% for rolling rule '{rolling_rule}'") | |
else: | |
print("Rolling rule '{0}' not found.".format(rolling_rule)) | |
if __name__ == '__main__': | |
if len(sys.argv) == 1: | |
main_roll_stats("droplow_4d6") | |
elif len(sys.argv) >= 2: | |
if sys.argv[1] == "roll": | |
rolling_rule = sys.argv[2] if len(sys.argv) >= 3 else "droplow_4d6" | |
main_roll_stats(rolling_rule) | |
elif sys.argv[1] == "avg": | |
rolling_rule = sys.argv[2] if len(sys.argv) >= 3 else "all" | |
if rolling_rule == "all": | |
for rolling_rule in list(rule_map.keys()): | |
main_calc_avg(rolling_rule) | |
else: | |
main_calc_avg(rolling_rule) | |
elif sys.argv[1] == "check27": | |
rolling_rule = sys.argv[2] if len(sys.argv) >= 3 else "all" | |
if rolling_rule == "all": | |
for rolling_rule in list(rule_map.keys()): | |
main_check27(rolling_rule) | |
else: | |
main_check27(rolling_rule) | |
else: | |
print("Natural 1 on Usage skill check!") | |
else: | |
print("Natural 1 on Usage skill check!") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Average for rolling rule 'droplow_4d6' is 30.66825 | |
Average for rolling rule 'droplow_4d6_rr1' is 40.48254 | |
Average for rolling rule 'strict_3d6' is 17.06773 | |
Average for rolling rule 'sixplus_2d6' is 36.46026 | |
Average for rolling rule 'sixplus_droplow_3d6' is 51.39305 | |
Average for rolling rule 'droplow2_5d6' is 41.23471 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pbe>27: 60.8%, pbe=27: 3.8%, pbe<27: 35.4% for rolling rule 'droplow_4d6' | |
pbe>27: 91.3%, pbe=27: 1.8%, pbe<27: 6.9% for rolling rule 'droplow_4d6_rr1' | |
pbe>27: 12.5%, pbe=27: 2.2%, pbe<27: 85.3% for rolling rule 'strict_3d6' | |
pbe>27: 82.0%, pbe=27: 2.9%, pbe<27: 15.0% for rolling rule 'sixplus_2d6' | |
pbe>27: 99.3%, pbe=27: 0.2%, pbe<27: 0.5% for rolling rule 'sixplus_droplow_3d6' | |
pbe>27: 90.7%, pbe=27: 1.6%, pbe<27: 7.6% for rolling rule 'droplow2_5d6' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment