Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Probably Dice by tokiojapan55
import math
def find_first(dice_number, sides, target, init_number=1):
result = []
for n in range(dice_number):
result.append(init_number)
for n in range(dice_number):
result[n] = sides
if sum(result) == target:
return result
if sum(result) > target:
result[n] = sides - (sum(result) - target)
if result[n] < init_number:
return None
return result
return None
def find_next(dices, sides):
target = sum(dices)
for n in range(1, len(dices)):
if dices[n] < sides:
dices[n] = dices[n] + 1
tmp = find_first(n, sides, target - sum(dices[n:]), dices[n])
if tmp != None:
dices = tmp + dices[n:]
return dices
return None
def variation(dices, sides):
dd = []
for d in range(sides):
dd.append(0)
for d in dices:
dd[d - 1] = dd[d - 1] + 1
base = 1
for d in dd:
if d > 1:
base *= math.factorial(d)
return math.factorial(len(dices)) // base
def probability(dice_number, sides, target):
dices = find_first(dice_number, sides, target)
count = 0
while dices != None:
count += variation(dices, sides)
dices = find_next(dices, sides)
return count / sides ** dice_number
June 8, 2020
Comments: