Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
formula from http://mathworld.wolfram.com/Dice.html solution in Clear category for Probably Dice by Gaburieru-sama
import math
def binomio(n1,n2):
return math.factorial(n1)/(math.factorial(n1-n2)*math.factorial(n2))
def probability(dice_number, sides, target):
max_possibilidades=sides**dice_number #número máximo de possibilidades
possibilidade=0
if(target>(dice_number*sides)): ###Checa se é possível a soma dos dados chegar no target
return 0
k=math.floor((target-dice_number)/sides)+1
for i in range(0,k): #estudei a formula nesse link: http://mathworld.wolfram.com/Dice.html
possibilidade += ((-1)**i)*(binomio(dice_number,i))*(binomio(target-1-i*sides,dice_number-1))
return float("{0:.4f}".format(possibilidade/max_possibilidades))
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"
Sept. 30, 2018