[ create a new paste ] login | about

Link: http://codepad.org/twbzmbhb    [ raw code | output | fork ]

Ruby, pasted on Mar 6:
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"
}


Output:
1
2
3
4
5
6
7
8
C/D       5      10      15      20      30
non    8.79    9.51    9.75    9.87    9.96
 10   11.49   14.19   15.93   17.20   18.98
  9   14.66   18.71   21.14   22.87   25.32
  8   18.62   24.00   27.23   29.55   32.85
  7   23.85   30.90   35.15   38.20   42.54
  6   31.22   40.53   46.15   50.18   55.91



Create a new paste based on this one


Comments: