Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Probably Dice by kazusoga1002guitar.42p67
import itertools
from decimal import *
import math
#import numpy a
from scipy.special import comb
from collections import Counter
def multiple_permutation(seq):
dic = Counter(seq)
ans = math.factorial(len(seq))
for i in dic:
ans /= math.factorial(dic[i])
return ans
def probability(dice_number, sides, target):
#all = itertools.product(range(1, sides+1), repeat=dice_number)
#a = len([i for i in all if sum(i)==target])/(sides**dice_number)
all = itertools.combinations_with_replacement(range(1, sides+1), dice_number)
a = sides**dice_number
#d = [len(list(itertools.permutations(i))) for i in all if sum(i)==target]
b = sum([multiple_permutation(i) for i in all if sum(i)==target])
#b = len(d)*math.factorial(dice_number)
c = b/a
#print(d)
print(float(Decimal(str(c)).quantize(Decimal('0.0001'), ROUND_HALF_UP)))
return float(Decimal(str(c)).quantize(Decimal('0.0001'), ROUND_HALF_UP))
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"
Dec. 11, 2018