Разделите одно число на набор уникальных случайных чисел в PHP

#php

#php

Вопрос:

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

Например, у меня есть 100, но я хочу иметь 10 случайных чисел, которые при сложении вместе составляют 100.

С моими ограниченными знаниями я написал это:

 <?php
$_GET['total'] = $total;
$_GET['divided'] = $divided;
echo 'Starting with total: ' . $total;
echo '<br />';
echo 'Divided between: ' . $divided;
$randone = rand(1, $total);
$randonecon = $total - $randone;
echo '<br />';
echo 'First random number: ' . $randone;
$randtwo = rand(1, $randonecon);
$randtwocon = $total - $randtwo;
echo '<br />';
echo 'Second random number: ' . $randtwo;
?>
 

Конечно, это сбой, потому что я не знаю, как сделать так, чтобы числа были в массиве, который не позволяет им превышать заданную сумму.

Полностью благодаря Матею Михаю, это сделано!

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Randomize</title>
</head>

<body>

<?php

$_GET['total'] = $total;
$_GET['divided'] = $divided;


function generateRandomNumbers($max, $count)
{
$numbers = array();

    for ($i = 1; $i < $count; $i  ) {
        $random = mt_rand(0, $max / ($count - $i));
        $numbers[] = $random;
        $max -= $random;
    }

    $numbers[] = $max;

    return $numbers;
}
echo '<pre>'; 
print_r(generateRandomNumbers($total, $divided));
echo '</pre>';

?>


<form id="form1" name="form1" method="get" action="">
  <label for="total">Total</label>
  <br />
  <input type="text" name="total" id="total" />
  <br /> 
   <label for="divided">Divided</label>
  <br />
  <input type="text" name="divided" id="divided" />
  <br />
  <input type="submit" value="Go!">
</form>
</body>
</html>
 

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

1. должны ли числа быть целыми числами? если нет: просто добавьте свои числа, разделите ваше целевое число на сумму и умножьте все ваши числа на результат.

2. @FranzGleichmann Да, они должны быть целыми числами.

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

Ответ №1:

Вы можете попробовать использовать небольшую функцию для генерации этих чисел:

 function generateRandomNumbers($max, $count)
{
    $numbers = [];

    for ($i = 1; $i < $count; $i  ) {
        $random = mt_rand(0, $max / ($count - $i));
        $numbers[] = $random;
        $max -= $random;
    }

    $numbers[] = $max;

    shuffle($numbers);

    return $numbers;
}

echo '<pre>';
print_r(generateRandomNumbers(100, 10));
echo '</pre>';
 

Функция сгенерирует массив, подобный:

 Array
(
    [0] => 0
    [1] => 1
    [2] => 6
    [3] => 11
    [4] => 14
    [5] => 13
    [6] => 3
    [7] => 6
    [8] => 13
    [9] => 33
)
 

Пожалуйста, обратите внимание, что вместо $random = mt_rand(0, $max / ($count - $i)); я мог бы использовать напрямую $random = mt_rand(0, $max) , но в более позднем случае шансы получить много 0 в результирующем массиве больше, чем в первом случае.

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

1. Это именно то, чего я хотел! Большое вам спасибо! Я обнаружил, что код не работает, пока я не заменил: $numbers = []; на $ numbers = array();

2. Да .. это потому, что синтаксис коротких массивов был добавлен с PHP 5.4, поэтому вы, вероятно, используете более низкую версию..

3. Теперь я понимаю!

4. Это было полезно, но у меня есть небольшой нюанс: можем ли мы получить тот же результат, не имея нулей ни в одном элементе массива?