Techioz Blog

Ruby 配列から平均を作成するにはどうすればよいですか?

概要

配列から平均を見つけるにはどうすればよいでしょうか?

配列がある場合:

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

平均すると 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

別のコメント投稿者が示唆しているように、配列の一部として定義することもできますが、整数の除算は避ける必要があります。そうしないと、結果が間違ってしまいます。また、これは一般に、考えられるすべての要素タイプに適用できるわけではありません (明らかに、平均は平均化できるものについてのみ意味を持ちます)。ただし、そのルートに進みたい場合は、これを使用してください。

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

  def mean 
    sum / size
  end
end

これまでに inject を見たことがない人にとって、それは見た目ほど魔法ではありません。各要素を反復処理し、それにアキュムレータ値を適用します。その後、アキュムレータは次の要素に渡されます。この場合、アキュムレータは、前のすべての要素の合計を反映する単なる整数です。

編集: コメント者の Dave Ray が素晴らしい改善を提案してくれました。

編集: arr.inject(:+).to_f を使用するコメント投稿者の Glenn Jackman の提案も素晴らしいですが、何が起こっているのか分からない場合は少し賢すぎるかもしれません。 :+ は記号です。 inject に渡されると、シンボルで指定されたメソッド (この場合は加算演算) がアキュムレータ値に対して各要素に適用されます。