あなたの数学のスキルをテストする時間...
私はphpを使用して、$ num1、$ num2、$num3などの平均を見つけています。未設定の数まで。次に、その平均をデータベースに保存します。
次回phpスクリプトが呼び出されると、新しい番号がミックスに追加されます。
新しい数を含めた元の数の平均を見つけるために使用できる数学(おそらく代数)方程式はありますか?または、元の数値をデータベースに保存して、それらにクエリを実行し、数値の束全体を一緒に再計算できるようにする必要がありますか?
array_sum($values) / count($values)
平均で意味するのが「平均」であり、すべての数値を保存したくない場合は、それらの数を保存します。
$last_average = 100;
$total_numbers = 10;
$new_number = 54;
$new_average = (($last_average * $total_numbers) + $new_number) / ($total_numbers + 1);
Average = Sum / Number of values
3つの値すべてを保存するだけで、複雑なことは何も必要ありません。
を保存してから計算するAverage
と、平均が切り捨てられるため、精度が少し低下します。Sum
Number of values
を保存してから計算する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つの情報を保存することです:
平均を取得したいときはいつでも、合計をカウントで割ります(もちろん、カウント== 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;
}
コード:
function avg($list){
$sum = array_sum($list);
$count = count($list);
return ($count)? $sum / $count: NAN;
}
print ("Average: ".avg([1,2,3,4,5]));
出力:
Average: 3
元の番号をすべてデータベースに保存する必要があります。