Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
Distributions Convolution solution in Clear category for Probably Dice by ayubutrym
def convolve(v1, v2):
res = [0] * (len(v1) + len(v2) - 1)
for i1, x1 in enumerate(v1):
for i2, x2 in enumerate(v2):
res[i1 + i2] += x1 * x2
return res
def probability(dice_number, sides, target):
res = v = [0] + [1 / sides] * sides
for _ in range(dice_number - 1):
res = convolve(res, v)
return res[target] if 0 < target < len(res) else 0
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"
print("OK")
Feb. 4, 2019
Comments: