Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
Formula solution in Speedy category for Probably Dice by Kurush
import math
def probability(dice_number, sides, target):
if target > dice_number * sides: return 0
if target < dice_number * 1: return 0
up_limit = int((target - dice_number) / (1.0 * sides))
success = 0
for k in range(up_limit + 1):
success += (-1) ** k * binom(dice_number, k) * binom(target - sides * k - 1, dice_number - 1)
possible = sides ** dice_number
probability = 1.0 * success / possible
return probability
def binom(n, k):
return math.factorial(n) / (math.factorial(k) * math.factorial(n - k))
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"
June 29, 2014
Comments: