Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
defaultdicts as dice solution in Clear category for Probably Dice by rossras
from collections import defaultdict
def probability(dice_number, sides, target):
# use dicts where:
# keys are numbers you can roll
# values are how many ways you can roll that number
def mul(d1, d2):
d3 = defaultdict(int)
for num1, ways1 in d1.items():
for num2, ways2 in d2.items():
d3[num1+num2] += ways1*ways2
return d3
single_die = defaultdict(int, ((i, 1) for i in range(1, sides+1)))
d = single_die
for i in range(dice_number - 1):
d = mul(d, single_die)
return d[target] / sides**dice_number
if __name__ == '__main__':
#These are only used for self-checking and are not necessary for auto-testing
def almost_equal(checked, correct, significant_digits=4):
precision = 0.1 ** significant_digits
return correct - precision < checked < correct + precision
assert(almost_equal(probability(2, 6, 3), 0.0556)), "Basic example"
assert(almost_equal(probability(2, 6, 4), 0.0833)), "More points"
assert(almost_equal(probability(2, 6, 7), 0.1667)), "Maximum for two 6-sided dice"
assert(almost_equal(probability(2, 3, 5), 0.2222)), "Small dice"
assert(almost_equal(probability(2, 3, 7), 0.0000)), "Never!"
assert(almost_equal(probability(3, 6, 7), 0.0694)), "Three dice"
assert(almost_equal(probability(10, 10, 50), 0.0375)), "Many dice, many sides"
Aug. 25, 2018
Comments: