【问题标题】:How can I find a set of random numbers that sum to a specific number?如何找到一组总和为特定数字的随机数?
【发布时间】:2017-04-28 18:42:39
【问题描述】:

这是我下面的代码。如果三个随机数的总和等于 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;

}

【问题讨论】:

  • 有什么要循环的。?试试 if($valuestotal === 100) {} else {} 看看会发生什么。
  • 我选择标题作为循环,因为我试图通过循环获得我的结果。但我已经完成了哈哈。我想循环我的条件,当它达到总数的 100 时,它应该回显它,但如果它没有达到,它应该一遍又一遍地尝试达到,我这样做时很困惑。 // 编辑:我试过 if else 但我没有得到我想要的。
  • 您只想要一个概率还是要打印多个概率或所有概率?
  • 我想循环多次,直到找到 100 的结果(总共 3 个变量)... 将寻找答案,谢谢大家!
  • @OzanŞiarPalik : 请考虑accepting an answer

标签: php


【解决方案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 的存在是为了避免随机减去太多,以便为其余的重复留出足够的空间。

【讨论】:

  • 非常聪明的提高效率的方法!
【解决方案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

【讨论】:

  • 非常感谢。
【解决方案3】:

while 循环中,只要条件满足,就会执行块 真的。所以你可以想,你必须多次执行什么,然后 什么时候停止?

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

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

现在应该在 sum 为 100 时停止。循环中说明的条件 必须为 true 才能运行多次,所以从这个意义上说,它必须 在总和 not 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);

【讨论】:

  • 刚看到这个be4我发布了一个答案(现在不再需要,并且与这个^^相比也避免了DV),它干净高效+1(尽管@Twisty的答案也很酷)。
  • 感谢您的精彩回答。
  • @OzanŞiarPalik 很高兴为您提供帮助 :) 谢谢您提出的好问题。有很多方法可以解决这个问题,您可以从收到的各种各样的答案中看出!
【解决方案4】:

您只需要获得 2 个总和小于 100 的随机数,然后从 100 中减去该总和即可获得第三个随机数。这个函数以一种简单的方式做到了这一点:

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,因为您确定您不希望只有 1 中的 100变量。

【讨论】:

    【解决方案5】:
    <?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;
                }
            }
    ?>
    

    这应该会给你一个想法,完成脚本可能需要几分之一秒,也可能需要很长时间,这取决于你的运气!

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 2023-01-13
          • 2010-11-16
          • 2017-07-25
          • 1970-01-01
          • 2017-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多