Проблема создания лучшего случайного алгоритма – ежедневный спред

Мне нужен алгоритм, который распространяет некоторые числа в течение дня в процентах, следуя за минимальным / максимальным процентом за это правило, это то, что у меня есть:

public function getSpread() { $rules = [ '00-07' => ['min' => 5, 'max' => 10], '08-12' => ['min' => 20, 'max' => 30], '13-16' => ['min' => 20, 'max' => 30], '17-22' => ['min' => 25, 'max' => 40], '23-24' => ['min' => 10, 'max' => 15], ]; $spread = []; foreach ($rules as $time => $rule) { $value = rand($rule['min'], $rule['max']); while ($this->getNewSum($spread, $value) > 100) { $value = $value - 1; } $spread[$time] = $value; } return $spread; } private function getNewSum($spread, $value) { $sum = 0 + $value; foreach ($spread as $s) { $sum = $sum + $s; } return $sum; } 

Результаты:

 array:5 [ "00-07" => 5 "08-12" => 24 "13-18" => 30 "19-22" => 32 "23-24" => 9 ] array:5 [ "00-07" => 8 "08-12" => 29 "13-18" => 29 "19-22" => 27 "23-24" => 7 ] array:5 [ "00-07" => 8 "08-12" => 28 "13-18" => 21 "19-22" => 33 "23-24" => 10 ] array:5 [ "00-07" => 9 "08-12" => 20 "13-18" => 21 "19-22" => 25 "23-24" => 15 ] array:5 [ "00-07" => 8 "08-12" => 28 "13-18" => 20 "19-22" => 29 "23-24" => 10 ] array:5 [ "00-07" => 9 "08-12" => 20 "13-18" => 22 "19-22" => 28 "23-24" => 15 ] array:5 [ "00-07" => 5 "08-12" => 23 "13-18" => 23 "19-22" => 40 "23-24" => 9 ] 

Любой способ оптимизировать это и сделать его более «случайным», id – иметь возможность увеличить минимальные правила max, но если я это сделаю, конечный элемент страдает и всегда становится 0

Идентификатор фактически был бы оптимальным для создания этого по часам, а не от часа до часа.