2010-01-10 5 views
12

temps pour tester vos compétences en mathématiques ...moyenne Math avec php

J'utilise php pour trouver num1 $ la moyenne, $ num2, $ num3 et ainsi de suite; jusqu'à une quantité non définie de nombres. Il enregistre ensuite cette moyenne dans une base de données.

La prochaine fois que le script PHP sera appelé, un nouveau numéro sera ajouté au mixage.

Existe-t-il une équation mathématique (l'algèbre la plus probable) que je peux utiliser pour trouver la moyenne des nombres originaux avec le nouveau nombre inclus. Ou dois-je enregistrer les numéros d'origine dans la base de données pour pouvoir les interroger et recalculer l'ensemble des nombres ensemble?

Répondre

10

Si ce que vous entendez par moyenne est moyenne et que vous ne souhaitez pas enregistrer tous les numéros, puis stocker la quantité de numéros:

$last_average = 100; 
$total_numbers = 10; 
$new_number = 54; 

$new_average = (($last_average * $total_numbers) + $new_number)/($total_number + 1); 
+0

'$ total_numbers' peut ne pas être disponible. –

+4

$ total_numbers est un détail d'implémentation ** requis ** pour le problème spécifié. L'implémenter ou le problème est insoluble. – slebetman

+6

Cela entraînera une perte de précision toujours croissante. Utilisez $ last_total au lieu de $ last_average. Voir la réponse de Mike. – GZipp

-2

Vous devez enregistrer tous les numéros originaux dans la base de données.

1

Si vous connaissez le nombre de chiffres, vous pouvez calculer l'ancienne somme, ajouter la nouvelle et diviser par l'ancien montant plus un.

$oldsum = $average * $amount; 
$newaverage = ($oldsum + $newnum)/($amount + 1); 
+0

@slebetman - Mais c'est la même chose que la réponse que vous avez acceptée. – GZipp

+0

Ah .. désolé, j'ai mal lu le code. Je me rétracte mon commentaire précédent. – slebetman

12
Average = Sum/Number of values 

magasin juste les 3 valeurs, il n'y a pas besoin de quoi que ce soit compliqué.

Si vous stockez le Average et Sum calcule ensuite Number of values vous perdrez un peu de précision en raison de la troncature de moyenne.

Si vous stockez le Average et Number of values puis de calculer Sum vous perdrez encore plus de précision. Vous avez plus de marge d'erreur dans le calcul d'une valeur correcte pour Number of values que Sum car il s'agit d'un nombre entier.

+0

Vous n'avez pas besoin de stocker la moyenne, vous pouvez le calculer sans aucune perte de précision. – starblue

1

En général ce que vous pourriez faire est d'économiser deux informations:

  • la somme de tous les nombres
  • le nombre de numéros

Chaque fois que vous voulez obtenir la moyenne, il faut diviser la somme par le compte (en prenant soin du cas du compte == 0, bien sûr). Chaque fois que vous souhaitez inclure un nouveau numéro, ajoutez le nouveau nombre à la somme et incrémentez le nombre de 1.

0

Ceci est appelé «moyenne courante» ou «moving average».

Si la base de données stocke la moyenne et le nombre de valeurs moyennées, il sera possible de calculer une nouvelle moyenne mobile pour chaque nouvelle valeur.

45
array_sum($values)/count($values) 
+0

Pourquoi n'ai-je pas pensé à cela haha ​​ –

+0

Division par zéro lorsque les valeurs de $ sont vides –

+0

$ avg = 0; if (nombre (valeur $)) { $ moy = valeur_multiple (valeurs $)/nombre (valeurs $); } –

0
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; 
} 
2

pensé que je devrais partager ma fonction

function avg($sum=0,$count=0){ 
    return ($count)? $sum/$count: NAN; 
} 
var_dump(avg(array_sum($values),count($values))); 

retournera la moyenne et aussi prendre en compte 0, par exemple la division par zéro revient toujours NaN (pas un nombre)

1/0 = NaN
0/0 = NaN