【问题标题】:Generate two numbers that are NOT equal in PHP在 PHP 中生成两个不相等的数字
【发布时间】:2009-10-11 10:26:50
【问题描述】:

我需要在 PHP 中生成两个不相等的数字。

我知道我使用$random1 = (rand()%9); 生成0-9 之间的随机数。我想我需要添加一些东西。

谢谢!

【问题讨论】:

    标签: php random numbers


    【解决方案1】:
    $random1 = 4;
    $random2 = 5;
    

    【讨论】:

    • 其实这很有趣,如果它是基于这里找到的卡通:xkcd.com/221。如果不是基于此,我想它不是那么有趣:-)
    • 其实是受到那部漫画的启发 :-D
    • 我向你保证,两者都是随机生成的。
    【解决方案2】:
    $numbers = array_rand(range(0, 9), 2);
    
    echo '<pre>';
    print_r($numbers);
    echo '</pre>';
    

    【讨论】:

      【解决方案3】:
      $r = str_shuffle("0123456789");
      $r1 = (int) $r[0];
      $r2 = (int) $r[1];
      

      【讨论】:

      • 哇,这实际上是一个非常巧妙的解决方案。
      • 虽然是确定性的,但在一般情况下,此解决方案可能比公认的解决方案要慢。这也不能处理两位数的数字。
      【解决方案4】:
      $rnd1 = rand(0,9);
      do {
        $rnd2 = rand(0,9);
      } while ($rnd1 == $rnd2);
      

      【讨论】:

      • 理论上,如果数字是真正随机的,这可能会永远循环。在大多数计算机应用程序中不太可能,但运行时间不确定的,这可能是不可取的。
      • 幸运的是,大多数计算机都使用实用而非理论上的随机生成器 :)。作为回报,这两个随机数彼此独立(原始约束除外)。
      • @Fred,如果您想确保此代码不会按照建议运行多年,您可以设置一个计数器来计算重试次数,然后在阈值之后简单地返回 ($rnd1+1) %10 或其他。
      • 理论上,一颗陨石随时可能击中服务器机房并摧毁里面的一切。在实践中,它不会。不要担心低概率。
      • 实际上,@DrJokepu,我们确实为这种可能性做好了计划(不一定是陨石,但肯定是服务器位置被破坏)。我们在 50 多公里外有一个备用站点。我记得有一个偏执狂问如果灾难摧毁了这两个地方,我们会怎么做。我的回答是,对于任何如此大的灾难,我们手头上的问题要比丢失的数据多得多。
      【解决方案5】:
      $random1 = (rand() % 10)
      $random2 = $random1 + (rand()%9)+1 
      

      这样它们永远不会相等(因为至少 1 将添加到 $random1 )

      如果两个数字都必须在 0-9 之间,您只需使用最后一个 mod 操作即可:

      $random1 = (rand() % 10)
      $random2 = ($random1 + (rand()%9)+1 ) %10 
      

      【讨论】:

      • 我喜欢那个。很好地使用模数。
      • 这弄乱了标准分布 - 较低的数字变得比较高的数字稍微更有可能,尽管在这种情况下它可能并不明显。
      • @chris:请解释为什么较低的数字更有可能。我不明白为什么。
      【解决方案6】:
      function random($min, $max) {
          $stack = range($min, $max);
          shuffle($stack); 
          $nr1 = array_pop($stack);
          $nr2 = array_pop($stack);
          return array($nr1, $nr2);
      }
      

      这可能会在不成为数学天才的情况下解决问题:)

      【讨论】:

      • 我猜shuffle 至少是线性的,所以这对于max 来说并不能很好地扩展。但是,如果您需要超过 2 个不同的随机数,这会很有效。
      • ...超过 2 个不同的随机整数。
      【解决方案7】:

      我想你会发现rand()%9 会给你一个介于 0 到 8 之间的数字。如果您想要 0 到 9(含),则应使用 rand()%10。我将假设这就是您想要的,但如果 0 到 8 是您真正想要的,您可以轻松调整答案。

      如果您想要该范围内的两个数字,最简单的方法是在该范围内生成一个,然后在小于该范围的一个内生成另一个,如果相同或更大,则增加它。

      这是执行此操作的数学方法,它是确定性的(总是两次调用 rand() 无论如何)。虽然不太可能,但真正的随机数生成器可以生成一串完全相同的数字,这会使循环解决方案变得不明智(您可能正在使用线性生成器,因此这可能不会成为问题)。

      在第一次尝试时,您可以选择全部范围(10 个数字,0 到 9)。在第二个你有完整的范围减去已经选择的数字。因此,如果您的第一个数字是 7,则生成一个从 0 到 8 的数字并将 7 映射到 8 和 8 到 9:

      $random1 = (rand() % 10);
      $random2 = (rand() % 9);
      if $random2 >= $random1 {
          $random2 = $random2 + 1;
      }
      

      【讨论】:

      • 这在随机数之间引入了很大的依赖性。例如,如果 random1 为 5,则 random2 成为 6 的可能性高于任何其他数字。
      • 我认为如果 $random2 >= $random1 会做出更好的改变,但也许我错过了另一个极端情况。
      • 是的,你是对的@Kobi,这就是我的意思,但这里已经很晚了 :-)
      • @Zed,那是我没有正确写下来的假象。正如@Kobi 指出的那样,如果您使用正确的语句进行映射,则概率是正确的。
      • @Pax - 应该是$random2 &gt;= $random1。以你现在的方式,赔率仍然是错误的,数字最终可能相等。
      【解决方案8】:

      如果您只是想要唯一数字,只需从零开始,然后为每个新数字添加 +1。

      如果您需要随机唯一数字,只需将您以前的数字保存在一个列表中,当您需要一个新数字时,只需生成随机数字,直到找到一个,这不是 em> 在那个列表中。

      如果需要唯一标识符,可以使用内置函数uniqid

      【讨论】:

        【解决方案9】:
        $r = mt_rand(0, 9);
        $r2 = ($r || $r === 9) ? $r-1 : $r+1;
        

        解释:

        $r:0到9的数字。

        $r2:总是从 0 到 9 但$r-1$r+1

        更随机的方式是生成 2 个数字:

        $r = mt_rand(0, 9);
        $r2 = mt_rand(0, 9);
        $r2 = $r!==$r2 ? $r2 : (($r || $r === 9) ? $r-1 : $r+1);
        

        此外,如果您使用 PHP 7+,您可以将 mt_rand 更改为 random_int

        【讨论】:

          【解决方案10】:

          Alix Axel 的解决方案是最直接的,对我来说效果很好。我想要一个现有数组中的三个随机条目,所以我使用了

          $rands = array_rand(range(0,count($otherarray)),3);
          

          然后显示密钥在$rands 中的条目。

          【讨论】:

            【解决方案11】:
            $random1 = rand() % 9;
            $random2 = ($random1 + 1) % 9;
            

            【讨论】:

            • 这里的第二个数字将完全可以根据第一个数字预测。
            • OP 只声明数字不能相等。他从未说过第二个必须是随机的。
            • +1 因为虽然有点厚脸皮,但这正是操作所要求的。虽然我认为 $random1 = rand() % 9; $随机2 = $rand1++;也可以;)
            【解决方案12】:

            相当重地解释您的问题,您似乎想在 0 和 9 之间伪随机生成 2 个不同的整数?

            所以生成第一个,生成另一个,如果它与第一个重复,直到它不是。

            我毫无理由地断言,这将与任何其他方法一样有效。

            【讨论】:

              【解决方案13】:
              $random_numbers = array();
              for ($i = 0; $i <= 1; $i++)
              {
                $random_numbers[$i] = rand(1,13);
              }
              

              我通过将 rand 放在 for 循环内的数组中解决了这个问题。这样我得到了两个不同的随机数!这两个数字放在数组中的两个字段中,random_numbers[0]random_numbers[1]

              【讨论】:

              • 这怎么不允许重复数字? rand() 仍然可以在 random_numbers[0]random_numbers[1] 中生成 6。
              猜你喜欢
              • 2016-08-27
              • 1970-01-01
              • 1970-01-01
              • 2015-09-25
              • 2016-02-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多