Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
Probably Dice from General Formula solution in Clear category for Probably Dice by dobyvillanueva
def probability(dice_number, sides, target):
P = 0.0000
# Check for impossible probability
if (dice_number > target) or (dice_number * sides < target):
return P
# Got formula from http://mathworld.wolfram.com/Dice.html
k_max = int((target-dice_number)/(sides*1.0))
for k in range(k_max+1):
P+= ((-1)**k)*(m(dice_number,k))*(m(target-sides*k-1, target-sides*k-dice_number))
P *= (1.0/(sides**dice_number))
return round(P,4)
# factorial function
def f(n):
if n > 1:
return n*f(n-1)
return 1
# eval matrix
def m(a,b):
return f(a)/(f(b)*f(a-b))
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"
Nov. 11, 2017