Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Probably Dice by swagg010164
from math import floor, factorial
from math import factorial as fac
#more info here: http://mathworld.wolfram.com/Dice.html
def kmax(p, dice_number, sides):
return floor((p - dice_number)/sides) # p - points
def probability(dice_number, sides, target):
if dice_number*sides < target or target == 0:
return 0
kmax_res = [0]*dice_number
for p in range(1*dice_number, dice_number*sides + 1):
kmax_res.append(kmax(p, dice_number, sides))
needle = kmax_res[target]
cur_res = 0
for k in range(needle+1):
first = (-1)**(k)*fac(dice_number)/(fac(k)*fac(dice_number - k))
second = 1
for i in range(dice_number - 1):
second *= (target - sides*k - (i+1))
second /= fac(dice_number - 1)
cur_res += first*second
return cur_res/(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"
Feb. 17, 2019
Comments: