如何从数组中求平均值?

如果我有一个数组:

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

平均得到3.375。


当前回答

为了让公众开心,还有另一个解决方案:

a = 0, 4, 8, 2, 5, 0, 2, 6
a.reduce [ 0.0, 0 ] do |(s, c), e| [ s + e, c + 1 ] end.reduce :/
#=> 3.375

其他回答

试试这个:

arr = [5, 6, 7, 8]
arr.inject{ |sum, el| sum + el }.to_f / arr.size
=> 6.5

请注意.to_f,它可以避免整数除法带来的任何问题。你还可以:

arr = [5, 6, 7, 8]
arr.inject(0.0) { |sum, el| sum + el } / arr.size
=> 6.5

您可以像另一位评论者建议的那样将其定义为Array的一部分,但您需要避免整数除法,否则您的结果将是错误的。而且,这并不适用于所有可能的元素类型(显然,平均值只适用于可以求平均值的东西)。但如果你想走这条路,可以用这个:

class Array
  def sum
    inject(0.0) { |result, el| result + el }
  end

  def mean 
    sum / size
  end
end

如果您以前没有见过inject,那么它并没有看起来那么神奇。它遍历每个元素,然后对其应用累加器值。然后将累加器传递给下一个元素。在本例中,累加器只是一个反映之前所有元素之和的整数。

编辑:评论者戴夫·雷提出了一个很好的改进。

编辑:评论者格伦·杰克曼的提议,使用arr.inject(:+)。To_f也很好,但如果你不知道发生了什么,可能有点太聪明了。:+是一个符号;当传递给inject时,它对每个元素对累加器值应用由符号命名的方法(在本例中为加法操作)。

我希望Math.average(values),但没有这样的运气。

values = [0,4,8,2,5,0,2,6]
average = values.sum / values.size.to_f
class Array
  def sum 
    inject( nil ) { |sum,x| sum ? sum+x : x }
  end

  def mean 
    sum.to_f / size.to_f
  end
end

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

你可以试试下面的方法:

a = [1,2,3,4,5]
# => [1, 2, 3, 4, 5]
(a.sum/a.length).to_f
# => 3.0

这个方法很有用。

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])