配列から平均を求めるにはどうすればよいでしょうか?
配列がある場合:
[0,4,8,2,5,0,2,6]
平均すると 3.375 になります。
ベストアンサー1
これを試して:
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
、これは見た目ほど魔法のようなものではありません。各要素を反復処理し、アキュムレータ値を適用します。次に、アキュムレータは次の要素に渡されます。この場合、アキュムレータは、前のすべての要素の合計を反映する単なる整数です。
編集:コメント投稿者の Dave Ray が素晴らしい改善を提案しました。
編集:コメント投稿者の Glenn Jackman 氏の を使用する提案arr.inject(:+).to_f
も素晴らしいですが、何が起こっているのか分からない場合は少し巧妙すぎるかもしれません。 は:+
シンボルです。 inject に渡されると、シンボルで指定されたメソッド (この場合は加算演算) が各要素に対してアキュムレータ値に適用されます。