кратчайшее решение для вашей проблемы, что я могу думать, было бы:
$m = 110; // desired sum
$v = 8; // desired elements
$x = []; // result
for($i = 1; $i < $v; $i++)
$x[$i] = rand(1, $m - array_sum($x) - (($v - $i) * $v));
$x[0] = $m-array_sum($x);
// print results
print_r($x);
printf("Elements sum to: %d\n",array_sum($x));
что приводит к
Array
(
[1] => 16
[2] => 13
[3] => 15
[4] => 23
[5] => 5
[6] => 7
[7] => 1
[0] => 30
)
Elements sum to: 110
так ура, только то, что вы хотели, хотя это может быть оптимизирован для лучше распространение. но позвольте мне объяснить строку для строки.
Сначала я только что инициализировал три переменные. $m
- желаемая сумма, которую вы хотите иметь для всех ваших элементов. $v
- количество элементов (N), которые вы хотите сгенерировать. и $x
содержит массив со всеми N о том, что где вычисляется, так что результат нас интересует:
$m = 110; // desired sum
$v = 8; // desired elements
$x = []; // result
Теперь мы начинаем цикл по элементам, которые мы хотим вычислить. Заметьте, что мы начинаем с 1, так как мы будем использовать 0 для вычисления последнего значения позже:
for($i = 1; $i < $v; $i++)
и сейчас здесь идет «умственный» мы устанавливаем текущий элемент $x[$i]
для случайной величины. в PHP мы можем передавать значения min и max в случайную функцию, поэтому я выбрал 1 как min, чтобы избежать 0 и max, которые я выбрал. Я объясню немного более подробно в конце, но, очевидно, мы хотим избежать того, чтобы в качестве первого значения было 110 а остальные нули, и это, как мы делаем так:
$x[$i] = rand(1, $m - array_sum($x) - (($v - $i) * $v));
на последнем шаге теперь мы должны убедиться, что мы в конечном итоге с желаемой суммой, так что вместо того, чтобы идти наугад, я просто установить элемент до требуемой максимальной суммы за вычетом суммы всех существующих элементов:
$x[0]=$m-array_sum($x);
последние строки кода просто распечатывать результаты, но, как и обещал, позвольте мне объяснить «complica ted "макс часть случайной функции, которую я выбрал.
$m - array_sum($x) - (($v - $i) * $v)
функция один PHP, который приходит очень удобно здесь является array_sum
функция, которая добавляет все элементы массива. если бы мы просто набрали rand(1,110)
на каждый элемент, тогда мы могли бы легко получить сумму выше , поэтому мы вычитаем сумму всех существующих элементов из максимального значения, чтобы избежать этого из первых рук: $m - array_sum($x)
. поэтому, если последние три генерируемые элементы составляют до , то следующий элемент может быть не выше (110 - 43).мы все равно могли бы получить результат вроде (12,7,24,5,62,0,0,0), и мы не получим нулей, поэтому нам придется вычесть количество оставшихся элементов $v - $i
, которые будут избегайте нулей.
снова мы все же можем получить результат вроде (12,7,24,5,59,1,1,1), и это не выглядит красиво, поэтому последняя оптимизация заключалась в том, чтобы умножить это на произвольное номер, чтобы оставить больше места для более высоких значений - в этом случае я просто использовал $v
(количество элементов) как произвольное число, но вы можете играть с этим значением, т.е. (($v - $i) * 12))
, пока не получите желаемый результат.
Каковы правила отношений между N1 и N2 и т. Д.? – BigScar
Просто случайные числа, это могут быть любые целые числа, которые могут быть суммированы как 110 в конце. – DarkAmazon
Тогда ответ «да, вы можете сделать это на PHP». rand(), mt_rand() и петли, вероятно, будут эффективны. Попробуйте написать код и посмотреть, что произойдет. – BigScar