Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
|
|
@ -0,0 +1,19 @@
|
|||
from itertools import product
|
||||
|
||||
def gen_dict(n_faces, n_dice):
|
||||
counts = [0] * ((n_faces + 1) * n_dice)
|
||||
for t in product(range(1, n_faces + 1), repeat=n_dice):
|
||||
counts[sum(t)] += 1
|
||||
return counts, n_faces ** n_dice
|
||||
|
||||
def beating_probability(n_sides1, n_dice1, n_sides2, n_dice2):
|
||||
c1, p1 = gen_dict(n_sides1, n_dice1)
|
||||
c2, p2 = gen_dict(n_sides2, n_dice2)
|
||||
p12 = float(p1 * p2)
|
||||
|
||||
return sum(p[1] * q[1] / p12
|
||||
for p, q in product(enumerate(c1), enumerate(c2))
|
||||
if p[0] > q[0])
|
||||
|
||||
print beating_probability(4, 9, 6, 6)
|
||||
print beating_probability(10, 5, 7, 6)
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
from __future__ import print_function, division
|
||||
|
||||
def combos(sides, n):
|
||||
if not n: return [1]
|
||||
ret = [0] * (max(sides)*n + 1)
|
||||
for i,v in enumerate(combos(sides, n - 1)):
|
||||
if not v: continue
|
||||
for s in sides: ret[i + s] += v
|
||||
return ret
|
||||
|
||||
def winning(sides1, n1, sides2, n2):
|
||||
p1, p2 = combos(sides1, n1), combos(sides2, n2)
|
||||
win,loss,tie = 0,0,0 # 'win' is 1 beating 2
|
||||
for i,x1 in enumerate(p1):
|
||||
# using accumulated sum on p2 could save some time
|
||||
win += x1*sum(p2[:i])
|
||||
tie += x1*sum(p2[i:i+1])
|
||||
loss+= x1*sum(p2[i+1:])
|
||||
s = sum(p1)*sum(p2)
|
||||
return win/s, tie/s, loss/s
|
||||
|
||||
print(winning(range(1,5), 9, range(1,7), 6))
|
||||
print(winning(range(1,11), 5, range(1,8), 6)) # this seem hardly fair
|
||||
|
||||
# mountains of dice test case
|
||||
# print(winning((1, 2, 3, 5, 9), 700, (1, 2, 3, 4, 5, 6), 800))
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
from __future__ import division, print_function
|
||||
from itertools import accumulate # Python3 only
|
||||
|
||||
def combos(sides, n):
|
||||
ret = [1] + [0]*(n + 1)*sides # extra length for negative indices
|
||||
for p in range(1, n + 1):
|
||||
rolling_sum = 0
|
||||
for i in range(p*sides, p - 1, -1):
|
||||
rolling_sum += ret[i - sides] - ret[i]
|
||||
ret[i] = rolling_sum
|
||||
ret[p - 1] = 0
|
||||
return ret
|
||||
|
||||
def winning(d1, n1, d2, n2):
|
||||
c1, c2 = combos(d1, n1), combos(d2, n2)
|
||||
ac = list(accumulate(c2 + [0]*(len(c1) - len(c2))))
|
||||
|
||||
return sum(v*a for v,a in zip(c1[1:], ac)) / (ac[-1]*sum(c1))
|
||||
|
||||
|
||||
print(winning(4, 9, 6, 6))
|
||||
print(winning(5, 10, 6, 7))
|
||||
|
||||
#print(winning(6, 700, 8, 540))
|
||||
Loading…
Add table
Add a link
Reference in a new issue