Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Probably Dice by Fedme
import math
def probability(dice_number, sides, target):
if dice_number*sides< target or dice_number>target:
return 0
def nCr(n,r):
f = math.factorial
return f(n) / f(r) / f(n-r)
prob = (1/sides)**dice_number
maxval = (target-dice_number)/sides
sum = 0
for x in range(int(maxval)+1):
sum += (-1)**x * nCr(dice_number,x) * nCr(target-sides*x-1,dice_number-1)
print(sum)
return sum*prob
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
print(probability(2, 6, 3))
print(probability(3, 6, 7))
# 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 21, 2014
Comments: