Skip to content

Instantly share code, notes, and snippets.

@ribbanya
Last active September 28, 2017 17:18
Show Gist options
  • Save ribbanya/5b9f0d3e37695a98864712e3afcbf7b2 to your computer and use it in GitHub Desktop.
Save ribbanya/5b9f0d3e37695a98864712e3afcbf7b2 to your computer and use it in GitHub Desktop.
2d6+a vs. 2d6+b Probability Simulator
import random
def main():
trials = 1000000
print_each_trial = False
reroll_if_tie = True
print('A', 'B', 'A%', 'B%', 'Tie%', sep='\t')
for a_mod in range(-3, 3 + 1):
for b_mod in range(-3, 3 + 1):
results = {'a' : 0, 'b' : 0, 'tie' : 0}
for t in range(trials):
while True: # reroll-if-Tie loop
a = _2d6() + a_mod
b = _2d6() + b_mod
if (print_each_trial):
print ("{0} vs. {1}: ".format(a, b), end='')
if (a == b):
if (print_each_trial):
print("Tie.", end='')
if (reroll_if_tie):
if (print_each_trial):
print(" Rerolling.")
continue
if (print_each_trial):
print()
results['tie'] += 1
elif (a > b):
if (print_each_trial):
print ("A wins.")
results['a'] += 1
elif (b > a):
if (print_each_trial):
print("B wins.")
results['b'] += 1
else:
assert False, "Logically impossible"
break # reroll-if-Tie loop
results_probabilities = {k: v / trials for k, v in results.items()}
print(a_mod, b_mod, results_probabilities['a'], results_probabilities['b'], results_probabilities['tie'], sep='\t')
def _2d6():
return random.randint(1, 6) + random.randint(1, 6)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment