Вычисление медианы массива в переполнении стека

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

Это то, что я до сих пор:

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

Решение

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

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

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

Код: (демонстрация)

$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;
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]