Как я могу найти набор случайных чисел, которые суммируются с определенным числом?

Это мой код ниже. Сам код эха, если сумма из трех случайных чисел равна 100. Теперь, чтобы получить результат 100 как $valuestotal мне приходится $valuestotal перезагружать страницу. Но я хочу получить результат 100 как $valuestotal каждый раз, когда я перезагружаю страницу. Как я могу это сделать?

Я думал, что это будет возможно с петлей в цикле. Но он дает тот же результат x раз. Я хочу, чтобы PHP продолжал пробовать разные случайные значения, и когда он достигает значения 100 в качестве $valuestotal , он должен $valuestotal

То, что я действительно хочу, например, я хочу, чтобы три случайных числа получили всего 100, например, 35 и 25 и 50. Или 25 и 15 и 60 … список продолжается …

Как это возможно?

 $values = rand(1, 100); $values2 = rand(1, 100); $values3 = rand(1, 100); $valuestotal = $values + $values2 + $values3; // while ($valuestotal === 100) { echo $values; echo '<br>'; echo $values2; echo '<br>'; echo $values3; echo "<br>"; echo $valuestotal; } 

Вам не нужно зацикливаться внутри цикла. Например, вы можете сделать это:

 <?php $keepChecking = true; $values = 0; $values2 = 0; $values3 = 0; $valuestotal = 0; while($keepChecking){ $values = rand(1, 100); $values2 = rand(1, 100); $values3 = rand(1, 100); $valuestotal = $values + $values2 + $values3; if ($valuestotal === 100){ $keepChecking = false; } } echo $values; echo '<br>'; echo $values2; echo '<br>'; echo $values3; echo "<br>"; echo $valuestotal; ?> в <?php $keepChecking = true; $values = 0; $values2 = 0; $values3 = 0; $valuestotal = 0; while($keepChecking){ $values = rand(1, 100); $values2 = rand(1, 100); $values3 = rand(1, 100); $valuestotal = $values + $values2 + $values3; if ($valuestotal === 100){ $keepChecking = false; } } echo $values; echo '<br>'; echo $values2; echo '<br>'; echo $values3; echo "<br>"; echo $valuestotal; ?> 

Результатами могут быть:

 2 37 61 100 

Здесь можно протестировать: http://phpfiddle.org/lite

В цикле while блок будет выполняться, пока условие истинно. Итак, вы можете подумать, что вам нужно выполнять несколько раз, и когда он должен остановиться?

То, что вам нужно выполнить несколько раз, это сбор случайных чисел:

 while ( ... ) { # roll dice, save numbers } 

Теперь это должно прекратиться, когда сумма равна 100. Условие, указанное в цикле, должно быть истинным для того, чтобы оно выполнялось несколько раз, поэтому в этом смысле оно должно выполняться, пока сумма не равна 100. Вот ключевой момент, который вы получили в обратном порядке , Если ваше условие ложно (случайно это произойдет после первого запуска), то цикл уже остановлен. Вы должны бежать, пока сумма не равна 100, так что когда она есть, она больше не будет собирать случайные числа. Затем вы продолжаете повторять их.

 $valuestotal = 0; while ($valuestotal != 100) { $value1 = rand(1, 100); $value2 = rand(1, 100); $value3 = rand(1, 100); $valuestotal = $value1 + $value2 + $value3; } echo "$value1<br>$value2<br>$value3<br>$valuestotal"; 

В качестве альтернативного синтаксиса вы можете сохранить значения в массиве и использовать array_sum() :

 $numbers = []; while (array_sum($numbers) != 100) $numbers = [ rand(1, 100), rand(1, 100), rand(1, 100), ]; echo join(' + ', $numbers), ' = ', array_sum($numbers); 

Вам нужно будет получить только 2 случайных числа, сумма которых составляет менее 100, чем вычесть эту сумму из 100, чтобы получить 3 случайных случайных. Эта функция делает это просто:

 function get_three_rand_numbs_sum_hundred(){ $num1 = rand(1, 99); // Get first random number. $num2 = rand(1, 99); // Get second random number. $num3 = 0; // Declare variable which will evnetually hold 3rd random number. /* While the sum of the first 2 random numbers above is more than a 100, get another random number for Number 2.*/ while(($num1 + $num2) >= 100){ $num2 = rand(1, 99); } // Get the 3rd random number by subtracting the sum of the first two from 100. $num3 = 100 - ($num1 + $num2); echo "Number 1 : ".$num1."\n"; echo "Number 2 : ".$num2."\n"; echo "Number 3 : ".$num3."\n"; echo "Sum : ".($num3+$num2+$num1)."\n"; } 

ПРИМЕЧАНИЕ. Функция rand () обрабатывает параметр max, предоставляемый ему как исключительное значение, поэтому вы должны использовать 99 вместо 100, так как вы уверены, что не хотите, чтобы 100 из одной переменной.

Еще один возможный подход. Код немного более сложный, чем некоторые другие ответы, но я хотел добавить один из способов, который нужно было бы только зацикливать один раз.

 $target = 100; $n = 3; while ($n) { if (1 < $n--) { $addend = rand(0, $target - ($n - 1)); $target -= $addend; $addends[] = $addend; } else { $addends[] = $target; } } var_dump($addends); 

В основном вы вычитаете случайное число между 0 и оставшейся частью предыдущего вычитания n раз, пока осталось только одно повторение, а остальная часть – последняя часть. $n - 1 существует так, что он не случайно вычитает слишком много, чтобы оставалось достаточно для остальных повторений.

 <?php $valuesTotal = 0; while ($valuesTotal != 100){ $value1 = rand(1, 100); $value2 = rand(1, 100); $value3 = rand(1, 100); $valuesTotal = $value1+$value2+$value3; echo "\$value1 = $value1 :: \$value2 = $value2 :: \$value3 = $value3 :: \$valuesTotal = $valuesTotal"; } ?> 

Другой путь :

 <?php while (true){ $value1 = rand(1, 100); $value2 = rand(1, 100); $value3 = rand(1, 100); $valuesTotal = $value1+$value2+$value3; echo "\$value1 = $value1 :: \$value2 = $value2 :: \$value3 = $value3 :: \$valuesTotal = $valuesTotal"; if($valuesTotal == 100){ break; } } ?> 

Это должно дать вам Идею, для завершения сценария может потребоваться не более секунды, или это может занять вечность, в зависимости от вашей удачи!

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

Ранжировать значения внутри цикла и каждый раз устанавливать новое значение в значение $valuestotal цикл будет остановлен только в том случае, если $valuestotal = 100 .

 $valuestotal = 0; // while ($valuestotal !== 100) { echo $values; echo '<br>'; echo $values2; echo '<br>'; echo $values3; echo "<br>"; $values = rand(1, 100); $values2 = rand(1, 100); $values3 = rand(1, 100); echo $valuestotal . '<br>'; $valuestotal = $values + $values2 + $values3; } 

Я предполагаю, что вам нужно получить 3 разных случайных значения, сумма которых равна 100

Попробуй это

 $total = 100; $val1 = rand(1,$total); $val2 = rand(1, ($total-$val1)); $val3 = $total - ($val1 + $val2); print($val1."\n"); print($val2."\n"); print($val3."\n");