Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Массив случайных чисел с диапазоном значений определенной суммы php

#php #массивы #случайные_числа


Задача создать массив случайных чисел определенной длины, с заданным диапазоном чисел,
чтобы в сумме было определенное значение.
К примеру, нужно 5 чисел, с диапазоном 5-20, в сумме 50.
На выходе нужно что-то типа 6, 12, 13, 8, 11. 

Для тех, кто будет искать решение подобной задачи, пока единственное такое (можно
сразу и забрать себе):

function array_rand_with_sum($min, $max, $sum, $num)
{
   $a = array();
   if ($max*$num > $sum && $min < $sum\$num)
   {
      do
      {
         for($i = 0; $i < $num; $i ++)
         {
            $a[$i] = mt_rand($min, $max);
         }
      }
      while(array_sum($a) != $sum);
      return $a;
   }
   else { return "Ошибка! Проверьте входные данные."; }
}


Если кто-то найдет лучше - буду очень рад!
    


Ответы

Ответ 1



Надеяться, что ваша функция завершиться весьма опрометчиво, попробуйте такие входные параметры: array_rand_with_sum(1, 1000, 10000, 200); У меня из десятка попыток ни разу не удалось получить результат. Мой вариант функции примерно такой: function array_rand_with_sum($min, $max, $sum, $num) { if ($num <= 0 || $max * $num < $sum || $min * $num > $sum) { return "Ошибка! Проверьте входные данные."; } if ($num == 1) { return [$sum]; } $rand = mt_rand( max($min, $sum - $max * ($num - 1)), min($max, $sum - $min * ($num - 1)) ); $res = array_rand_with_sum($min, $max, $sum - $rand, $num - 1); $res[] = $rand; return $res; } $res = array_rand_with_sum(1, 1000, 10000, 200); if (is_array($res)) { var_dump([ 'min' => min($res), 'max' => max($res), 'sum' => array_sum($res), 'count' => count($res), ]); } var_dump($res);

Ответ 2



Не красиво, но как вариант function array_rand_with_sum($min, $max, $sum, $num) { $return = array(); $newsum = $sum; for($i=0;$i<$num;$i++) { $c = rand($min,($max<$newsum)?$max:$newsum); $newsum -= $c; $return[]= $c; } $array_sum = array_sum($return); arsort($return); if($array_sum>$sum) { $return[0]-= ($array_sum-$sum); } else { $return[count($return)-1]+= ($sum-$array_sum); } return $return; }

Комментариев нет:

Отправить комментарий