Случайно, но не должно превышать общее

rand(1,5)

.. генерирует случайные числа, например: 4 3 2 3 2 (сумма равна 14).

Я хочу, чтобы общая сумма НЕ превышала x (скажем, 5), поэтому в этом случае это может быть:

1 + 2 + 2 = 5
2 + 3 = 5

и так далее … переменной длины, пока sum < x

Должен ли я генерировать случайное число, проверять на х, генерировать другое, проверять снова или есть другой способ?

1

Решение

Самый очевидный способ — просто продолжать цикл и генерировать все меньшее и меньшее случайное число до тех пор, пока вы не остановитесь.

$min = 2;
$max = 5;
$randoms = [];
while ($max > $min) {
$max -= ( $rand = rand($min, $max) );
$randoms[] = $rand;
}

Обновлено для фактического варианта использования (см. Комментарии):

function generateRandomSpend($balance, $maximum = 5, $minimum = 2) {
$amounts = array();

while ($balance) {
// If we can't add any more minimum-spends, stop
if ($balance - $minimum < 0) {
break;
} else {
// Don't generate pointlessly-high values
$maximum = min($balance, $maximum);
$balance -= $amounts[] = rand($minimum, $maximum);
}
}

return $amounts;
}

print_r( $s = generateRandomSpend(10) );

Вы также можете сделать

echo array_sum( generateRandomSpend(10) );

чтобы получить числовое значение их общих расходов.

4

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

Это также работает и дает результат, который вы хотите

<?php
$fixed = 5;
$random = array();
$no = 0;
while(1) {
$number = rand(1,5);
$no +=$number;
if($no > $fixed) {
break;
}
$random[]= $number;
}
?>
3

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