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?

Foi útil?

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);
}
?>

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

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top