#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; }
Комментариев нет:
Отправить комментарий