Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Probably Dice by jusha
def probability(dice_number, sides, target):
if dice_number*sides < target or dice_number > target:
return 0.0000
else:
start = [[i+1,1] for i in range(sides)]
step = start
n = dice_number
summa_prob = start if dice_number == 1 else None
while n != 1:
summa = [[start[i][0]+step[y][0], start[i][1]*step[y][1]] for i in range(len(start)) for y in range(len(step))]
summa.sort()
summa_prob = []
for i in range(len(summa)-1):
if summa[i+1][0] != summa[i][0]:
summa_prob.append(summa[i])
elif summa[i+1][0] == summa[i][0]:
summa[i+1][1] += summa[i][1]
summa_prob.append(summa[-1])
start = summa_prob
n -= 1
for i in summa_prob:
if i[0]==target:
return round(i[1]/sides**dice_number,4)
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"
April 11, 2020
Comments: