Skip to content

Instantly share code, notes, and snippets.

@sixthgear
Created December 16, 2011 19:28
Show Gist options
  • Select an option

  • Save sixthgear/1487542 to your computer and use it in GitHub Desktop.

Select an option

Save sixthgear/1487542 to your computer and use it in GitHub Desktop.
import itertools
import fractions
def roll(faces, dice, keep):
results = {}
denom = faces ** dice
for roll in itertools.product(*[range(1,faces+1) for d in range(dice)]):
r = sum(sorted(roll, reverse=True)[:keep])
if not results.has_key(r): results[r] = fractions.Fraction(1, denom)
else: results[r] += fractions.Fraction(1, denom)
return results
rolls = (
('2d6', roll(6,2,2)),
('3d6', roll(6,3,3)),
('4d6k3', roll(6,4,3)),
('5d6k3', roll(6,5,3)),
('6d6k3', roll(6,6,3)),
('7d6k3', roll(6,7,3)),
)
for exp,results in rolls:
print 'roll %s' % exp
for r,f in results.iteritems():
print '%d: %d in %d' % (r, f.numerator, f.denominator)
print
# roll 1d6 roll 2d6 roll 3d6
# 1: 1 in 6 2: 1 in 36 3: 1 in 216
# 2: 1 in 6 3: 1 in 18 4: 1 in 72
# 3: 1 in 6 4: 1 in 12 5: 1 in 36
# 4: 1 in 6 5: 1 in 9 6: 5 in 108
# 5: 1 in 6 6: 5 in 36 7: 5 in 72
# 6: 1 in 6 7: 1 in 6 8: 7 in 72
# 8: 5 in 36 9: 25 in 216
# roll 2d6k1 9: 1 in 9 10: 1 in 8
# 1: 1 in 36 10: 1 in 12 11: 1 in 8
# 2: 1 in 12 11: 1 in 18 12: 25 in 216
# 3: 5 in 36 12: 1 in 36 13: 7 in 72
# 4: 7 in 36 14: 5 in 72
# 5: 1 in 4 roll 3d6k2 15: 5 in 108
# 6: 11 in 36 2: 1 in 216 16: 1 in 36
# 3: 1 in 72 17: 1 in 72
# roll 3d6k1 4: 7 in 216 18: 1 in 216
# 1: 1 in 216 5: 1 in 18
# 2: 7 in 216 6: 19 in 216 roll 4d6k3
# 3: 19 in 216 7: 1 in 8 3: 1 in 1296
# 4: 37 in 216 8: 17 in 108 4: 1 in 324
# 5: 61 in 216 9: 1 in 6 5: 5 in 648
# 6: 91 in 216 10: 17 in 108 6: 7 in 432
# 11: 1 in 8 7: 19 in 648
# roll 4d6k1 12: 2 in 27 8: 31 in 648
# 1: 1 in 1296 9: 91 in 1296
# 2: 5 in 432 roll 4d6k2 10: 61 in 648
# 3: 65 in 1296 2: 1 in 1296 11: 37 in 324
# 4: 175 in 1296 3: 1 in 324 12: 167 in 1296
# 5: 41 in 144 4: 5 in 432 13: 43 in 324
# 6: 671 in 1296 5: 2 in 81 14: 10 in 81
# 6: 65 in 1296 15: 131 in 1296
# roll 5d6k1 7: 1 in 12 16: 47 in 648
# 1: 1 in 7776 8: 19 in 144 17: 1 in 24
# 2: 31 in 7776 9: 14 in 81 18: 7 in 432
# 3: 211 in 7776 10: 29 in 144
# 4: 781 in 7776 11: 61 in 324 roll 5d6k3
# 5: 2101 in 7776 12: 19 in 144 3: 1 in 7776
# 6: 4651 in 7776 4: 5 in 7776
# roll 5d6k2 5: 5 in 2592
# 2: 1 in 7776 6: 41 in 7776
# 3: 5 in 7776 7: 5 in 432
# 4: 31 in 7776 8: 85 in 3888
# 5: 5 in 486 9: 37 in 972
# 6: 211 in 7776 10: 235 in 3888
# 7: 5 in 96 11: 665 in 7776
# 8: 97 in 972 12: 881 in 7776
# 9: 25 in 162 13: 1055 in 7776
# 10: 53 in 243 14: 385 in 2592
# 11: 205 in 864 15: 1111 in 7776
# 12: 763 in 3888 16: 935 in 7776
# 17: 305 in 3888
# roll 6d6k2 18: 23 in 648
# 2: 1 in 46656
# 3: 1 in 7776 roll 6d6k3
# 4: 7 in 5184 3: 1 in 46656
# 5: 1 in 243 4: 1 in 7776
# 6: 665 in 46656 5: 7 in 15552
# 7: 1 in 32 6: 13 in 7776
# 8: 3361 in 46656 7: 23 in 5184
# 9: 31 in 243 8: 149 in 15552
# 10: 373 in 1728 9: 457 in 23328
# 11: 2101 in 7776 10: 559 in 15552
# 12: 12281 in 46656 11: 451 in 7776
# 12: 4135 in 46656
# 13: 941 in 7776
# 14: 49 in 324
# 15: 1295 in 7776
# 16: 839 in 5184
# 17: 205 in 1728
# 18: 1453 in 23328
#
# roll 7d6k3
# 3: 1 in 279936
# 4: 7 in 279936
# 5: 7 in 69984
# 6: 37 in 69984
# 7: 469 in 279936
# 8: 1141 in 279936
# 9: 305 in 31104
# 10: 5747 in 279936
# 11: 10409 in 279936
# 12: 6053 in 93312
# 13: 27979 in 279936
# 14: 39277 in 279936
# 15: 2711 in 15552
# 16: 1127 in 5832
# 17: 14707 in 93312
# 18: 331 in 3456
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment