web-dev-qa-db-ja.com

PHPでの数学の平均

あなたの数学のスキルをテストする時間...

私は$ num1、$ num2、$ num3などの平均を見つけるためにphpを使用しています。未設定の数まで。次に、その平均をデータベースに保存します。

次にphpスクリプトが呼び出されたときに、新しい番号がミックスに追加されます。

新しい数が含まれている元の数の平均を見つけるために使用できる数学(おそらく代数)方程式はありますか?または、元の数値をデータベースに保存してクエリを実行し、一連の数値全体を一緒に再計算できるようにする必要がありますか?

15
Marcus

平均値が平均値であり、すべての数値を保存したくない場合は、数値の量を保存します。

$last_average = 100;
$total_numbers = 10;
$new_number = 54;

$new_average = (($last_average * $total_numbers) + $new_number) / ($total_number + 1);
13
slebetman
array_sum($values) / count($values)
52
Isra
Average = Sum / Number of values

3つの値すべてを保存するだけで、複雑なものは必要ありません。

AverageSumを保存すると、Number of valuesを計算します。Averageの切り捨てにより、精度が少し低下します。

AverageNumber of valuesを保存してからSumを計算すると、さらに正確さが失われます。整数であるため、Number of valuesの正しい値を計算する際に、Sumよりも誤差が大きくなります。

12
Mike
<?php
function avrg()
{
 $count = func_num_args();
 $args = func_get_args();
 return (array_sum($args) / $count);
}
?>

http://php.net/manual/en/function.array-sum.php#101727

4
Hamidreza

自分の機能を共有すべきだと思った

function avg($sum=0,$count=0){
    return ($count)? $sum / $count: NAN;
}
var_dump( avg(array_sum($values),count($values)) );

平均を返し、0も考慮します。たとえば、ゼロで割ると常にNaN(数値ではありません)が返されます

1/0 = NaN
0/0 = NaN

2
Timo Huovinen

古い合計を計算できる数がわかっている場合は、新しい合計を追加し、古い合計に1を加えて割ります。

$oldsum = $average * $amount;
$newaverage = ($oldsum + $newnum) / ($amount + 1);
1
johannes

通常、次の2つの情報を保存します。

  • すべての数値の合計
  • 数の数

平均を求めたいときはいつでも、合計をカウントで割ります(もちろん、count == 0の場合に注意してください)。新しい数値を含める場合は常に、新しい数値を合計に追加し、カウントを1ずつ増やします。

1
Greg Hewgill

これは「移動平均」または「 移動平均 」と呼ばれます。

データベースに平均値の平均値が保存されている場合は、新しい値ごとに新しい移動平均を計算できます。

0
pavium
function avgvals($avg_vals,$avg_delimiter=',') { 
 if ( (is_string($avg_vals) && strlen($avg_vals) > 2) && (is_string($avg_delimiter) && !empty($avg_delimiter)) ) { 
    $average_vals = explode($avg_delimiter, $avg_vals); 
        $return_vals = ( array_sum($average_vals) / count($average_vals) ); 
 } elseif ( (is_string($avg_vals) && strlen($avg_vals) <= 2) && (is_string($avg_delimiter) && !empty($avg_delimiter)) ) { 
        $return_vals = $avg_vals; 
 } else { 
        $return_vals = FALSE; 
 } 
   return $return_vals; 
}
0
Harold