質問
数学のスキルをテストする時間...
PHPを使用して、平均$ num1、$ num2、$ num3などを見つけます。未整合の数値まで。その後、その平均をデータベースに保存します。
次回、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
と 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;
}
データベース内のすべての元の番号を保存する必要があります。