class MoreMath::Sequence

def percentile(p = 50)

(excluding the 100).
the weighted average at x_(n + 1)p, which allows p to be in 0...100
There are many methods to compute the percentile, this method uses the
Returns the +p+-percentile of the elements.
def percentile(p = 50)
  (0...100).include?(p) or
    raise ArgumentError, "p = #{p}, but has to be in (0...100)"
  p /= 100.0
  sorted_elements = sorted
  r = p * (sorted_elements.size + 1)
  r_i = r.to_i
  r_f = r - r_i
  if r_i >= 1
    result = sorted_elements[r_i - 1]
    if r_i < sorted_elements.size
      result += r_f * (sorted_elements[r_i] - sorted_elements[r_i - 1])
    end
  else
    result = sorted_elements[0]
  end
  result
end