Média de matemática com PHP
Pergunta
Hora de testar suas habilidades matemáticas ...
Estou usando o PHP para encontrar a média de $ num1, $ num2, $ num3 e assim por diante; até uma quantidade não definida de números. Em seguida, salva essa média em um banco de dados.
Da próxima vez que o script PHP for chamado de um novo número é adicionado ao mix.
Existe uma equação de matemática (provavelmente álgebra) que eu posso usar para encontrar a média dos números originais com o novo número incluído. Ou preciso salvar os números originais no banco de dados para poder consultá-los e recalcular todo o grupo de números juntos?
Solução
Se o que você quer dizer com média é significativo e você não deseja armazenar todos os números, guarde a quantidade de números:
$last_average = 100;
$total_numbers = 10;
$new_number = 54;
$new_average = (($last_average * $total_numbers) + $new_number) / ($total_number + 1);
Outras dicas
array_sum($values) / count($values)
Average = Sum / Number of values
Basta armazenar todos os três valores, não há necessidade de nada complicado.
Se você armazenar o Average
e Sum
Em seguida, calcule Number of values
Você perderá um pouco de precisão devido ao truncamento da média.
Se você armazenar o Average
e Number of values
Em seguida, calcule Sum
Você perderá ainda mais precisão. Você tem mais margem para erro ao calcular um valor correto para Number of values
do que Sum
Graças a ser um número inteiro.
<?php
function avrg()
{
$count = func_num_args();
$args = func_get_args();
return (array_sum($args) / $count);
}
?>
Pensei que eu deveria compartilhar minha função
function avg($sum=0,$count=0){
return ($count)? $sum / $count: NAN;
}
var_dump( avg(array_sum($values),count($values)) );
Retornará a média e também levará em consideração 0, por exemplo, dividir por zero sempre retorna Nan (não um número)
1/0 = nan
0/0 = NAN
Se você souber a quantidade de números, pode calcular a soma antiga, adicione a nova e divida pela quantidade antiga mais uma.
$oldsum = $average * $amount;
$newaverage = ($oldsum + $newnum) / ($amount + 1);
Normalmente, o que você pode fazer é salvar duas informações:
- a soma de todos os números
- a contagem de números
Sempre que você quiser obter a média, divida a soma pela contagem (cuidando do caso da contagem == 0, é claro). Sempre que você quiser incluir um novo número, adicione o novo número à soma e incrementa a contagem em 1.
Isso é chamado de 'média de corrida' ou 'média móvel'.
Se o banco de dados armazenar a média e O número de valores calculou a média, será possível calcular uma nova média de corrida para cada novo valor.
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;
}
Você precisa salvar todos os números originais no banco de dados.