MAX = 2000 # max calc an end
DICE = [5, 10, 15, 20, 30] # dice
CR = [6, 7, 8, 9, 10, 11].reverse # crit
def hit_ratio(d, c, m)
def less(d, c, m)
h = [10, 1, 2, 3, 4, 5, 6, 7, 8, 9][m % 10]
cr = (1.0 - (c - 1) / 10.0) ** ((m - 0.1) / 10).to_i
hr = 1.0 - ((h <= c ? h : c) - 1) / 10.0
(1.0 - (cr * hr)) ** d
end
less(d, c, m+1) - less(d, c, m)
end
# Calc
tbl = CR.map {|cr|
DICE.map {|dice|
(1..MAX).inject(0) {|t, m| t + m * hit_ratio(dice, cr, m) }
}
}
# View
print 'C/D', DICE.map {|e| sprintf("%8d", e) }.join, "\n"
tbl.each_with_index {|e, i|
print CR[i] > 10 ? 'non' : sprintf("%3d", CR[i]), e.map {|f| sprintf("%8.2f", f) }.join, "\n"
}