如何找到一组总和为特定数字的随机数?

时间:2017-04-28 18:42:40

标签: php

这是我的代码如下。如果三个随机数之和等于100,代码本身就会回响。现在要将结果100作为$valuestotal,我必须重新加载页面。但是每次重新加载页面时,我希望得到100的结果$valuestotal。我怎么能这样做?

我认为循环中的循环是可能的。但它给出了相同的结果x次。我希望PHP继续尝试不同的随机值,当它达到$valuestotal的值100时,它应该回显$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;

}

7 个答案:

答案 0 :(得分:2)

您不需要在循环内循环。例如,您可以这样做:

<?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

答案 1 :(得分:2)

while循环中,只要条件为,就会执行该块 真正。所以你可以想一想,你有多少次执行,以及 什么时候应该停止?

多次执行需要的是随机收集 数:

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

现在,当sum为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 :(得分:1)

您只需要获得总计小于100的2个随机数,然后从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来自100变量

答案 3 :(得分:1)

另一种可能的方法。代码比其他一些答案稍微复杂一点,但我想添加一种只需要循环一次的方法。

$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是有的,所以它不会随机减去太多,因为剩下的重复剩余就足够了。

答案 4 :(得分:0)

<?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;
            }
        }
?>

这应该给你一个想法,完成脚本可能需要几分之一秒,或者它可能需要永远,这取决于你的运气!

您需要编写代码以在循环的括号之间重复执行,而不是在它的顶部。

答案 5 :(得分:0)

将循环内的值随机化,每次将新值设置为$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;

}

答案 6 :(得分:-1)

我假设您需要获得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");