Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Creative category for Probably Dice by panaro32
def probability(n,k,s):
p = [1]+[0]*n*k
for d in range(n):
for i in range(n*k,-1,-1):
p[i] = sum(p[i-j-1] for j in range(k) if i>j)/k
return p[s] if s<=n*k else 0
if __name__ == '__main__':
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"
June 22, 2014