【问题标题】:Random number in range [min - max] using PHP使用 PHP 的 [min - max] 范围内的随机数
【发布时间】:2010-11-13 17:46:39
【问题描述】:

有没有办法根据最小值和最大值生成随机数?

例如,如果 min 为 1,max 为 20,它应该生成 1 到 20 之间的任何数字,包括 1 和 20?

【问题讨论】:

标签: php security random


【解决方案1】:

在新的PHP7 中,终于有了对cryptographically secure pseudo-random integers. 的支持

int random_int ( int $min , int $max )

random_int — 生成加密安全的伪随机整数

这基本上使以前的答案过时了。

【讨论】:

  • 太好了!但是,除非网络主机在全球范围内更广泛地支持 PHP7,否则不幸的是,这对于任何构建产品以供分发的人都没有用。因此,以前在 PHP7 上也可以使用的答案仍然是最佳实践。
  • @MattCromwell。我不同意你的看法。在托管服务支持 PHP7 之前,我们应该为 random_intrandom_bytes 函数使用 polyfill - github.com/paragonie/random_compat
  • 我很好奇,有没有理由不使用random_int ?如果它提供“更好”的随机数,为什么不将它用于非加密原因?
  • @BrianLeishman 我宁愿将它用于一切。我能猜到的唯一缺点:它可能依赖于随机性的来源,如果你没有随机性,它可能会失败。它可能更贵(需要检查),但我怀疑这个功能会产生很大的不同
  • 我确实知道它比较慢,但它微不足道,足以不回去将现有的random_ints 更改为rands。另外,我的用例是一个重试算法,我绝对不希望多个失败的函数在睡眠后因为可预测的随机整数而聚集在一起
【解决方案2】:

我已将答案捆绑在这里并使其与版本无关;

function generateRandom($min = 1, $max = 20) {
    if (function_exists('random_int')):
        return random_int($min, $max); // more secure
    elseif (function_exists('mt_rand')):
        return mt_rand($min, $max); // faster
    endif;
    return rand($min, $max); // old
}

【讨论】:

    【解决方案3】:
    <?php
      $min=1;
      $max=20;
      echo rand($min,$max);
    ?>
    

    【讨论】:

    • 我认为 rand 的 min 和 max 是要使用的位数而不是数字 :) thnx
    • 相关:如果PHP_INT_MAX &lt; ($max-$min),则需要将区间加在一起,如this answer中所述。
    • PHP7.1 之前的 rand() 简直太糟糕了。它使用 LCG 算法,其结果可预测。它也很慢。由于 PHP7.1 rand() 是 mt_rand() 的别名,因此不再糟糕。 PHP7 还引入了加密安全的 random_int(),但除非必要,否则应避免使用,因为它比 mt_rand() 慢得多
    【解决方案4】:

    更快更快的版本将使用 mt_rand:

    $min=1;
    $max=20;
    echo mt_rand($min,$max);
    

    来源:http://www.php.net/manual/en/function.mt-rand.php

    注意:您的服务器需要启用 Math PHP 模块才能正常工作。如果没有,请让您的主机出错以启用它,或者您必须使用正常(且速度较慢)的 rand()。

    【讨论】:

    【解决方案5】:
    (rand() % ($max-$min)) + $min
    

    rand ( $min , $max )
    

    http://php.net/manual/en/function.rand.php

    【讨论】:

      【解决方案6】:

      试试这个。它会根据你的意愿生成id。

      function id()
      {
       // add limit
      $id_length = 20;
      
      // add any character / digit
      $alfa = "abcdefghijklmnopqrstuvwxyz1234567890";
      $token = "";
      for($i = 1; $i < $id_length; $i ++) {
      
        // generate randomly within given character/digits
        @$token .= $alfa[rand(1, strlen($alfa))];
      
      }    
      return $token;
      }
      

      【讨论】:

        【解决方案7】:
        rand(1,20)
        

        PHP rand 函数的文档在这里:

        http://php.net/manual/en/function.rand.php

        使用srand()函数设置随机数生成器的种子值。

        【讨论】:

          猜你喜欢
          • 2015-06-05
          • 1970-01-01
          • 2016-11-02
          • 1970-01-01
          • 2021-08-17
          • 2021-12-14
          • 1970-01-01
          • 2016-11-17
          • 2011-12-16
          相关资源
          最近更新 更多