Как создать среднее из массива Ruby? - PullRequest
197 голосов
/ 27 августа 2009

Как бы найти среднее из массива?

Если у меня есть массив:

[0,4,8,2,5,0,2,6]

Усреднение дало бы мне 3,375.

Спасибо!

Ответы [ 18 ]

2 голосов
/ 27 августа 2009

На этом компьютере нет рубина, но что-то в этом роде должно работать:

values = [0,4,8,2,5,0,2,6]
total = 0.0
values.each do |val|
 total += val
end

average = total/values.size
1 голос
/ 25 января 2019

Этот метод может быть полезен.

def avg(arr)
  val = 0.0

  arr.each do |n|
    val += n
    end

  len = arr.length

  val / len 
end

p avg([0,4,8,2,5,0,2,6])
1 голос
/ 04 июня 2019

Добавить Array#average.

Я делал то же самое довольно часто, поэтому подумал, что было бы разумно просто расширить класс Array простым методом average. Он не работает ни для чего, кроме массива чисел, таких как целые числа или числа с плавающей запятой или десятичные числа, но это удобно, когда вы правильно его используете.

Я использую Ruby on Rails, поэтому поместил это в config/initializers/array.rb, но вы можете разместить его в любом месте, которое включено при загрузке и т. Д.

config/initializers/array.rb

class Array

  # Will only work for an Array of numbers like Integers, Floats or Decimals.
  #
  # Throws various errors when trying to call it on an Array of other types, like Strings.
  # Returns nil for an empty Array.
  #
  def average
    return nil if self.empty?

    self.sum / self.size
  end

end
1 голос
/ 27 августа 2009
a = [0,4,8,2,5,0,2,6]
sum = 0
a.each { |b| sum += b }
average = sum / a.length
1 голос
/ 28 ноября 2016

arr = [0,4,8,2,5,0,2,6] average = arr.inject(&:+).to_f / arr.size => 3.375

1 голос
/ 22 мая 2015
a = [0,4,8,2,5,0,2,6]
a.empty? ? nil : a.reduce(:+)/a.size.to_f
=> 3.375

Решает деление на ноль, целочисленное деление и легко читается. Может быть легко изменено, если вы решите, чтобы пустой массив возвращал 0.

Мне тоже нравится этот вариант, но он немного более объемный.

a = [0,4,8,2,5,0,2,6]
a.empty? ? nil : [a.reduce(:+), a.size.to_f].reduce(:/)
=> 3.375
0 голосов
/ 07 июля 2017

Вы можете попробовать что-то вроде следующего:

2.0.0-p648 :009 >   a = [1,2,3,4,5]
 => [1, 2, 3, 4, 5]
2.0.0-p648 :010 > (a.sum/a.length).to_f
 => 3.0
0 голосов
/ 02 августа 2011
[1,2].tap { |a| @asize = a.size }.inject(:+).to_f/@asize

Коротко, но с использованием переменной экземпляра

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...