あなたの数学のスキルをテストする時間...
私は$ num1、$ num2、$ num3などの平均を見つけるためにphpを使用しています。未設定の数まで。次に、その平均をデータベースに保存します。
次にphpスクリプトが呼び出されたときに、新しい番号がミックスに追加されます。
新しい数が含まれている元の数の平均を見つけるために使用できる数学(おそらく代数)方程式はありますか?または、元の数値をデータベースに保存してクエリを実行し、一連の数値全体を一緒に再計算できるようにする必要がありますか?
平均値が平均値であり、すべての数値を保存したくない場合は、数値の量を保存します。
$last_average = 100;
$total_numbers = 10;
$new_number = 54;
$new_average = (($last_average * $total_numbers) + $new_number) / ($total_number + 1);
array_sum($values) / count($values)
Average = Sum / Number of values
3つの値すべてを保存するだけで、複雑なものは必要ありません。
Average
とSum
を保存すると、Number of values
を計算します。Averageの切り捨てにより、精度が少し低下します。
Average
とNumber of values
を保存してからSum
を計算すると、さらに正確さが失われます。整数であるため、Number of values
の正しい値を計算する際に、Sum
よりも誤差が大きくなります。
<?php
function avrg()
{
$count = func_num_args();
$args = func_get_args();
return (array_sum($args) / $count);
}
?>
自分の機能を共有すべきだと思った
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
古い合計を計算できる数がわかっている場合は、新しい合計を追加し、古い合計に1を加えて割ります。
$oldsum = $average * $amount;
$newaverage = ($oldsum + $newnum) / ($amount + 1);
通常、次の2つの情報を保存します。
平均を求めたいときはいつでも、合計をカウントで割ります(もちろん、count == 0の場合に注意してください)。新しい数値を含める場合は常に、新しい数値を合計に追加し、カウントを1ずつ増やします。
これは「移動平均」または「 移動平均 」と呼ばれます。
データベースに平均値との平均値が保存されている場合は、新しい値ごとに新しい移動平均を計算できます。
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;
}