Вычисление медианы массива в PHP - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь выяснить, как рассчитать медиану массива случайно сгенерированных чисел.У меня все настроено, но у меня проблемы с созданием функции для расчета.

Это то, что у меня есть до сих пор:

//array 
$lessFifty = array();
$moreFifty = array();

//number generation
for ($i = 0; $i<=30; $i++) {
      $number = rand(0, 100);

//Sorting <50>      
if ($number < 50 ) {
    $lessFifty[] = $number;
} else {
    $moreFifty[] = $number; 
   } 
}
 echo print_r($lessFifty); 
 echo "<br>" ;
 echo print_r($moreFifty);

   //Average
echo "<p> Average of values less than fifty: </p>";
    print   array_sum($lessFifty) / count($lessFifty) ;
echo "<p> Average of values greater than fifty: </p>" ;  
    print   array_sum($moreFifty) / count($moreFifty) ;

//Median
$func = function (median ($array, $output = $median)){ 
    if(!is_array($array)){
        return FALSE;
    }else{
        switch($output){
                rsort($array);
                $middle = round(count($array) 2);
    $total = $array[$middle-1];
        break; 
    return $total;
    }
}

echo $func ; 

Я почти уверен, что делаю эту срединную часть совершенно неправильно.Я только учусь, и это становится проблемой.

1 Ответ

0 голосов
/ 21 сентября 2018

Будьте внимательны при написании цикла for().Если вам нужно 30 записей, вам не следует использовать <=, иначе вы получите 31, потому что $i начинается с 0.

Создайте массив случайных чисел, затем отсортируйте их.

Затем определите, есть ли у вас центральная запись (нечетная длина массива) или вам нужно усреднить две средние записи (четная длина массива).

Код: ( Demo )

$limit = 30;  // how many random numbers do you want?  30 or 31?
for ($i = 0; $i < $limit; ++$i) {
    $numbers[] = rand(0, 100);
}
var_export($numbers);

//echo "\n---\nAverage: " , array_sum($numbers) / $limit;
echo "\n---\n";

sort($numbers);
$count = sizeof($numbers);   // cache the count
$index = floor($count/2);  // cache the index
if (!$count) {
    echo "no values";
} elseif ($count & 1) {    // count is odd
    echo $numbers[$index];
} else {                   // count is even
    echo ($numbers[$index-1] + $numbers[$index]) / 2;
}

Возможный вывод:

array (
  0 => 27,
  1 => 24,
  2 => 84,
  3 => 43,
  4 => 8,
  5 => 51,
  6 => 60,
  7 => 86,
  8 => 9,
  9 => 48,
  10 => 67,
  11 => 20,
  12 => 44,
  13 => 85,
  14 => 6,
  15 => 63,
  16 => 41,
  17 => 32,
  18 => 64,
  19 => 73,
  20 => 43,
  21 => 24,
  22 => 15,
  23 => 19,
  24 => 9,
  25 => 93,
  26 => 88,
  27 => 77,
  28 => 11,
  29 => 54,
)
---
43.5

После сортировки элементы [14] и [15] удерживают 43 и 44 соответственно.Среднее значение этих «средних двух» - это то, как определяется результат.( демонстрация жестко закодированных чисел )


Если вы хотите короткий, негибкий, жестко закодированный фрагмент, то вы можете использовать 30 и 14 и 15 в качестве заданного размераи индексы.

for ($i = 0; $i < 30; ++$i) {
    $numbers[] = rand(0, 100);
}
sort($numbers);
echo ($numbers[14] + $numbers[15]) / 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...