Ruby/Method/Utility Method
Материал из Wiki.crossplatform.ru
Содержание |
Converting Between Degrees and Radians
class Numeric def degrees self * Math::PI / 180 end end puts 90.degrees puts Math::tan(45.degrees) # => 1.0 puts Math::cos(90.degrees) # => 6.12303176911189e-17 puts Math::sin(90.degrees) # => 1.0 puts Math::sin(89.9.degrees) # => 0.999998476913288 puts Math::sin(45.degrees) # => 0.707106781186547 puts Math::cos(45.degrees) # => 0.707106781186548
mean and standard deviation
def mean(array) array.inject(0) { |sum, x| sum += x } / array.size.to_f end def mean_and_standard_deviation(array) m = mean(array) variance = array.inject(0) { |variance, x| variance += (x - m) ** 2 } return m, Math.sqrt(variance/(array.size-1)) end puts mean_and_standard_deviation([1,2,3,1,1,2,1]) puts mean_and_standard_deviation([1,2,3,1,1,2,1000])
mean without float conversion
def mean(array) array.inject(0) { |sum, x| sum += x } / array.size.to_f end def mean_without_float_conversion(array) array.inject(0) { |x, sum| sum += x } / array.size end require "rational" numbers = [Rational(2,3), Rational(3,4), Rational(6,7)] puts mean(numbers) puts mean_without_float_conversion(numbers)
Taking Mean
def mean(array) array.inject(0) { |sum, x| sum += x } / array.size.to_f end puts mean([1,2,3,4]) # => 2.5 puts mean([100,100,100,100.1]) # => 100.025 puts mean([-100, 100]) # => 0.0 puts mean([3,3,3,3]) # => 3.0
Track Median
def mean(array) array.inject(0) { |sum, x| sum += x } / array.size.to_f end def median(array, already_sorted=false) return nil if array.empty? array = array.sort unless already_sorted m_pos = array.size / 2 return array.size % 2 == 1 ? array[m_pos] : mean(array[m_pos-1..m_pos]) end puts median([1,2,3,4,5]) # => 3 puts median([5,3,2,1,4]) # => 3 puts median([1,2,3,4]) # => 2.5 puts median([1,1,2,3,4]) # => 2 puts median([2,3,-100,100]) # => 2.5 puts median([1, 1, 10, 100, 1000]) # => 10
Track Mode
def modes(array, find_all=true) histogram = array.inject(Hash.new(0)) { |h, n| h[n] += 1; h } modes = nil histogram.each_pair do |item, times| modes << item if modes && times == modes[0] and find_all modes = [times, item] if (!modes && times>1) or (modes && times>modes[0]) end return modes ? modes[1...modes.size] : modes end puts modes([1,2,3,4]) # => nil puts modes([1,1,2,3,4]) # => [1] puts modes([1,1,2,2,3,4]) # => [1, 2] puts modes([1,1,2,2,3,4,4]) # => [1, 2, 4] puts modes([1,1,2,2,3,4,4], false) # => [1] puts modes([1,1,2,2,3,4,4,4,4,4]) # => [4]