31 lines
826 B
Text
31 lines
826 B
Text
require "table2"
|
|
|
|
local function throw_die(nsides, ndice, s, counts)
|
|
if ndice == 0 then
|
|
counts[s + 1] += 1
|
|
return
|
|
end
|
|
for i = 1, nsides do throw_die(nsides, ndice - 1, s + i, counts) end
|
|
end
|
|
|
|
local function beating_probability(nsides1, ndice1, nsides2, ndice2)
|
|
local len1 = (nsides1 + 1) * ndice1
|
|
local c1 = table.rep(len1, 0)
|
|
throw_die(nsides1, ndice1, 0, c1)
|
|
|
|
local len2 = (nsides2 + 1) * ndice2
|
|
local c2 = table.rep(len2, 0)
|
|
throw_die(nsides2, ndice2, 0, c2)
|
|
|
|
local p12 = (nsides1 ^ ndice1) * (nsides2 ^ ndice2)
|
|
local tot = 0
|
|
for i = 0, len1 - 1 do
|
|
for j = 0, math.min(i, len2) - 1 do
|
|
tot += c1[i + 1] * c2[j + 1] / p12
|
|
end
|
|
end
|
|
return tot
|
|
end
|
|
|
|
print(beating_probability(4, 9, 6, 6))
|
|
print(beating_probability(10, 5, 7, 6))
|