Средняя математика с php

Пора проверить свои математические способности...

Я использую php, чтобы найти среднее значение $num1, $num2, $num3 и так далее; до неустановленного количества номеров. Затем он сохраняет это среднее значение в базу данных.

В следующий раз, когда php-скрипт вызывается, к смеси добавляется новый номер.

Есть ли математическое (скорее всего, алгебраическое) уравнение, которое я могу использовать, чтобы найти среднее значение исходных чисел с включенным новым числом. Или мне нужно сохранить исходные числа в базе данных, чтобы я мог запросить их и пересчитать весь набор чисел вместе?


person Marcus    schedule 10.01.2010    source источник


Ответы (10)


Если то, что вы подразумеваете под средним, является «средним», и вы не хотите хранить все числа, сохраните их количество:

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

$new_average = (($last_average * $total_numbers) + $new_number) / ($total_numbers + 1);
person slebetman    schedule 10.01.2010
comment
$total_numbers может быть недоступен. - person Alix Axel; 10.01.2010
comment
$total_numbers – это обязательная деталь реализации для указанной проблемы. Либо внедряйте, либо проблема неразрешима. - person slebetman; 10.01.2010
comment
Это приведет к постоянно растущей потере точности. Используйте $last_total вместо $last_average. Смотрите ответ Майка. - person GZipp; 10.01.2010
comment
А, правда, не подумал об этом. Тогда лучше сохранить и $last_sum. - person slebetman; 10.01.2010

Average = Sum / Number of values

Просто сохраните все 3 значения, ничего сложного не нужно.

Если вы сохраните Average и Sum, а затем рассчитаете Number of values, вы немного потеряете точность из-за усечения среднего значения.

Если вы сохраните Average и Number of values, а затем рассчитаете Sum, вы потеряете еще большую точность. У вас больше права на ошибку при вычислении правильного значения для Number of values, чем для Sum, благодаря тому, что оно является целым числом.

person Mike    schedule 10.01.2010
comment
Вам не нужно хранить среднее значение, вы можете вычислить его без потери точности. - person starblue; 10.01.2010

<?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

person Hamidreza    schedule 05.12.2011

Думал, что я должен поделиться своей функцией

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

person Timo Huovinen    schedule 02.08.2013

Если вы знаете количество чисел, вы можете вычислить старую сумму, добавить новую и разделить на старую сумму плюс один.

$oldsum = $average * $amount;
$newaverage = ($oldsum + $newnum) / ($amount + 1);
person johannes    schedule 10.01.2010
comment
@slebetman - Но это то же самое, что и ответ, который вы приняли. - person GZipp; 10.01.2010
comment
Ах... извините, я неправильно прочитал код. Я отказываюсь от своего предыдущего комментария. - person slebetman; 10.01.2010

Обычно вы можете сохранить две части информации:

  • сумма всех чисел
  • количество чисел

Всякий раз, когда вы хотите получить среднее значение, разделите сумму на количество (конечно, позаботившись о случае count == 0). Всякий раз, когда вы хотите включить новое число, добавьте новое число к сумме и увеличьте количество на 1.

person Greg Hewgill    schedule 10.01.2010

Это называется «скользящее среднее» или «скользящее среднее.

Если в базе данных хранится среднее и количество усредненных значений, можно будет рассчитать новое скользящее среднее для каждого нового значения.

person pavium    schedule 10.01.2010

Код:

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
person leenremm    schedule 27.01.2021

Вам необходимо сохранить все исходные номера в базе данных.

person Alix Axel    schedule 10.01.2010

person    schedule
comment
Почему я не подумал об этом ха-ха - person Adam F; 07.02.2012
comment
Деление на ноль, когда $values ​​пусто - person Pascal_dher; 27.04.2017
comment
$среднее = 0; if(count($values)){ $avg = array_sum($values) / count($values); } - person Anurag Prashant; 17.01.2018