【问题标题】:php random x digit numberphp随机x位数
【发布时间】:2012-01-03 04:45:01
【问题描述】:

我需要创建一个包含 x 位数的随机数。

假设 x 是 5,我需要一个数字,例如。 35562 如果 x 是 3,那么它会抛出类似的东西; 463

谁能告诉我这是怎么做到的?

【问题讨论】:

    标签: php random numbers


    【解决方案1】:

    以下是生成特定长度验证码的简单方法。长度可指定,默认生成4位代码。

    function get_sms_token($length = 4) {
    
        return rand(
            ((int) str_pad(1, $length, 0, STR_PAD_RIGHT)),
            ((int) str_pad(9, $length, 9, STR_PAD_RIGHT))
        );
    }
    
    echo get_sms_token(6);
    

    【讨论】:

      【解决方案2】:

      以下代码生成一个4位随机数:

      echo sprintf( "%04d", rand(0,9999));
      

      【讨论】:

        【解决方案3】:

        您可以使用 mt_rand() 函数生成任何 x 位随机数。 mt_rand() 使用 rand() 函数更快 语法:mt_rand()mt_rand($min , $max)

        read more

        示例:<?php echo mt_rand(); ?>

        【讨论】:

          【解决方案4】:

          你可以使用简单的 php 函数 mt_rand(2000,9000) 来生成一个 4 位随机数

          mt_rand(2000,9000) 
          

          【讨论】:

            【解决方案5】:

            请注意 rand() 不会根据文档生成加密安全值:

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

            此函数不会生成加密安全值,不应用于加密目的。如果您需要加密安全值,请考虑改用 random_int()、random_bytes() 或 openssl_random_pseudo_bytes()。

            最好使用random_int(),它在 PHP 7 上可用(参见:http://php.net/manual/en/function.random-int.php)。

            所以要扩展@Marcus 的答案,您应该使用:

            function generateSecureRandomNumber($digits): int {
               return random_int(pow(10, $digits - 1), pow(10, $digits) - 1);
            }
            
            function generateSecureRandomNumberWithPadding($digits): string {
               $randomNumber = random_int(0, pow(10, $digits) - 1);
               return str_pad($randomNumber, $digits, '0', STR_PAD_LEFT);
            }
            

            请注意,如果您不需要安全随机数,则使用 rand() 即可。

            【讨论】:

            • 您能解释一下安全号码是什么意思吗?
            • 一个密码安全的随机数对于黑客来说更难预测。请记住,随机数的生成并不是真正随机的。例如,如果使用随机数创建一个 pin,您需要它的安全性以防止黑客发现它。如果随机数是用于动画的,那么黑客是否可以预测随机数将是什么也不用担心。
            • 感谢您的回复。我将不得不更深入地研究随机数的生成。这:Remember random number generation is not truly random 让我再次感到困惑。你的意思是因为肯定会有一种模式或算法在幕后工作?如果这就是你的意思,隐藏生成过程是否足够安全?
            • 这可能会有所帮助:paragonie.com/blog/2015/07/… 随机数生成器基于种子值。如果你知道种子值,你就会知道所有随机数的顺序。我不确定如何实现加密随机数,但它们比弱随机数生成器更安全。
            • 谢谢。我会通读一遍,看看能不能学到新东西。
            【解决方案6】:

            此功能完美运行,没有重复和所需的位数。

            $digits = '';
            function randomDigits($length){
                $numbers = range(0,9);
                shuffle($numbers);
                for($i = 0; $i < $length; $i++){
                    global $digits;
                    $digits .= $numbers[$i];
                }
                return $digits;
            }
            

            您可以调用该函数并传递位数例如:

            randomDigits(4);
            

            样本结果:

            4957 8710 6730 6082 2987 2041 6721

            原始脚本来自this gist

            【讨论】:

              【解决方案7】:

              这是一个简单的解决方案,没有任何循环或任何麻烦 允许您创建带有字符、数字甚至特殊符号的随机字符串。

              $randomNum = substr(str_shuffle("0123456789"), 0, $x);

              $x 可以是位数

              例如。 substr(str_shuffle("0123456789"), 0, 5);

              执行几次后的结果

              98450
              79324
              23017
              04317
              26479
              

              您也可以使用相同的代码生成随机字符串,像这样

              $randomNum=substr(str_shuffle("0123456789abcdefghijklmnopqrstvwxyzABCDEFGHIJKLMNOPQRSTVWXYZ"), 0, $x);
              

              $x = 11 的结果

              FgHmqpTR3Ox
              O9BsNgcPJDb
              1v8Aw5b6H7f
              haH40dmAxZf
              0EpvHL5lTKr
              

              【讨论】:

              • 嗯,改组似乎是个好主意,但它不会生成重复的数字/字符,例如 2312、abcb 等......
              【解决方案8】:
              function rand_number_available($already_mem_array,$boundary_min,$boundary_max,$digits_num)
              {
              
                  $already_mem_array_dim = count($already_mem_array);         // dimension of array, that contain occupied elements
              
                  // --- creating Boundaries and possible Errors
                  if( empty($digits_num) ){   
                          $boundary_dim = $boundary_max - $boundary_min;
                          if($boundary_dim <= 0){
                              $error = -1;                                    // Error that might happen. Difference between $boundary_max and $boundary_min must be positive
                          }else{
                              $error = -2;                                    // Error that might happen. All numbers between, $boundary_min and $boundary_max , are occupied, by $already_mem_array
                          }                                   
                  }else{
                          if($digits_num < 0){                                // Error. If exist, $digits_num must be, 1,2,3 or higher
                              $error = -3; 
                          }elseif($digits_num == 1){                          // if 'one-figure' number
                              $error = -4;                                    // Error that might happen. All 'one-figure' numbers    are occupied, by $already_mem_array
                              $boundary_min = 0;
                              $boundary_max = 9;
                              $boundary_dim = $boundary_max-$boundary_min;
                          }elseif($digits_num == 2){                          // if 'two-figure' number
                              $error = -5;                                    // Error that might happen. All 'two-figure' numbers    are occupied, by $already_mem_array
                              $boundary_min = 10;
                              $boundary_max = 99;
                              $boundary_dim = $boundary_max-$boundary_min;
                          }elseif($digits_num>2){                             // if 'X-figure' number. X>2
                              $error = -6;                                    // Error that might happen. All 'X-figure' numbers  are occupied, by $already_mem_array. Unlikely to happen
                              $boundary_min = pow(10, $digits_num-1);         // stepenovanje - graduation
                              $boundary_max = pow(10, $digits_num)-1;
                              $boundary_dim = $boundary_max-$boundary_min;
                          }
              
                  }
                  // -------------------------------------------------------------------
              
              
                  // --- creating response ---------------------------------------------
                  if( ($already_mem_array_dim <= $boundary_dim)   &&  $boundary_dim>0 ){              // go here only if, there are AVAILABLE numbers to extract, and [difference] $boundary_dim , is positive
                      do{
                          $num = rand($boundary_min,$boundary_max);
                      }while( in_array($num, $already_mem_array) );
                      $result = $num;
                  }else{
                      $result = $error;                                       // Limit that happened  
                  }
              
                  return $result;
                  // -------------------------------------------------------------------
              
              }
              

              【讨论】:

                【解决方案9】:

                rand(1000, 9999); 的运行速度比 rand(0,9); 快 4 倍

                基准测试:

                rand(1000, 9999)      : 0.147 sec.
                rand(0,9)x4 times     : 0.547 sec.
                

                这两个函数都运行了 100000 次迭代,以使结果更加明确

                【讨论】:

                • OP 正在寻求一种方法来创建一个包含 x 位数字的随机数。也许您可以编辑您的答案以匹配问题?
                【解决方案10】:
                function random_number($size = 5)
                {
                    $random_number='';
                    $count=0;
                    while ($count < $size ) 
                        {
                            $random_digit = mt_rand(0, 9);
                            $random_number .= $random_digit;
                            $count++;
                        }
                    return $random_number;  
                }
                

                【讨论】:

                • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 此代码回答问题的额外上下文将显着改善其长期-期限价值。请edit你的答案添加一些解释。
                【解决方案11】:

                我能想到的最简单的方法是使用rand 函数和str_pad

                <?php
                echo str_pad(rand(0,999), 5, "0", STR_PAD_LEFT);
                ?>
                

                在上面的例子中,它将生成 0 到 999 范围内的随机数。

                并且有 5 个数字。

                【讨论】:

                • 我认为这是迄今为止提到的最合适和最有效的解决方案。它不使用任何循环,不使用保证数字可以在结果中多次存在的随机播放,不需要大量代码来保证结果包含 x 位。
                【解决方案12】:

                这是另一种生成 N 位随机数的简单解决方案:

                $number_of_digits = 10;
                echo substr(number_format(time() * mt_rand(),0,'',''),0,$number_of_digits);
                

                在这里查看:http://codepad.org/pyVvNiof

                【讨论】:

                  【解决方案13】:

                  这个简单的脚本就可以了

                  $x = 4;//want number of digits for the random number
                  $sum = 0;
                  
                  
                  for($i=0;$i<$x;$i++)
                  {
                      $sum = $sum + rand(0,9)*pow(10,$i);
                  
                  }
                  
                  echo $sum;
                  

                  【讨论】:

                    【解决方案14】:

                    你们真的很喜欢把事情复杂化:)

                    真正的问题是 OP 可能希望将其添加到一些非常大的数字的末尾。如果没有,我认为没有必要这样做。因为任何数字中的左零都只是左零。

                    所以,只需将该数字的较大部分附加为数学总和,而不是字符串。

                    例如

                    $x = "102384129" . complex_3_digit_random_string();

                    变成了

                    $x = 102384129000 + rand(0, 999);

                    完成。

                    【讨论】:

                    • 这不能回答 OP 问题。
                    【解决方案15】:

                    randmt_rand 可以...

                    用法:

                    rand(min, max);
                    
                    mt_rand(min, max);
                    

                    【讨论】:

                    • OP 正在寻找一种方法来创建一个包含x 数字的随机数;您能否调整您的答案以提供如何使用randmt_rand 执行此操作的示例?
                    【解决方案16】:

                    您可以将rand()pow() 一起使用来实现这一点:

                    $digits = 3;
                    echo rand(pow(10, $digits-1), pow(10, $digits)-1);
                    

                    这将输出一个介于 100 和 999 之间的数字。这是因为 10^2 = 100 和 10^3 = 1000,然后您需要将其减去 1 以使其在所需范围内。

                    如果 005 也是一个有效示例,您可以使用以下代码用前导零填充它:

                    $digits = 3;
                    echo str_pad(rand(0, pow(10, $digits)-1), $digits, '0', STR_PAD_LEFT);
                    

                    【讨论】:

                    • 更简洁的方式:$digits = 3; echo random_int( 10 ** ( $digits - 1 ), ( 10 ** $digits ) - 1);
                    • 最佳答案
                    • 我决定将@Mr.Jo 的评论与实际答案进行基准测试,以下是基于总执行时间(以纳秒为单位)的结果:5 Number=> marcusVersion(): 36,916 ns; mrJoVersion(): 27,769 ns 10 数字=> marcusVersion(): 11,116 ns; mrJoVersion(): 41,748 ns 15 数字=> marcusVersion(): 17,543 ns; mrJoVersion(): 60,442 ns 20 数字=> marcusVersion(): 20,373 ns; mrJoVersion(): 77,534 ns 你的选择应该取决于你一次生成多少个数字
                    【解决方案17】:

                    将您的号码视为数字列表,每次只需附加一个随机数字:

                    function n_digit_random($digits) {
                      $temp = "";
                    
                      for ($i = 0; $i < $digits; $i++) {
                        $temp .= rand(0, 9);
                      }
                    
                      return (int)$temp;
                    }
                    

                    或者纯数值解:

                    function n_digit_random($digits)
                      return rand(pow(10, $digits - 1) - 1, pow(10, $digits) - 1);
                    }
                    

                    【讨论】:

                      【解决方案18】:

                      您可以使用rand($min, $max) 来达到这个目的。

                      为了将值限制为具有 x 位的值,您可以使用以下内容:

                      $x = 3; // Amount of digits
                      $min = pow(10,$x);
                      $max = pow(10,$x+1)-1);
                      $value = rand($min, $max);
                      

                      【讨论】:

                      • OP 要求一个带有$x 数字的数字,而不是某个数字和$x 之间的数字。
                      • 他不知道最小/最大,只知道预期数字的长度
                      • 它总是给 1000
                      【解决方案19】:
                      function random_numbers($digits) {
                          $min = pow(10, $digits - 1);
                          $max = pow(10, $digits) - 1;
                          return mt_rand($min, $max);
                      }
                      

                      经过测试here

                      【讨论】:

                      • 这个输出的数字也会带前导零吗?
                      • 你需要它有前导零吗?它已经是x 数字长了。 编辑:没关系,我想我理解你。不,它不会创建像“093”这样的数字。
                      • 很难改变吗?估计没关系。
                      • 如果您想允许像“00937”这样的数字作为 5 位数字,不,更改并不难。
                      【解决方案20】:

                      用循环来做:

                      function randomWithLength($length){
                      
                          $number = '';
                          for ($i = 0; $i < $length; $i++){
                              $number .= rand(0,9);
                          }
                      
                          return (int)$number;
                      
                      }
                      

                      【讨论】:

                        【解决方案21】:

                        我通常只使用RAND() http://php.net/manual/en/function.rand.php

                        例如

                        rand ( 10000 , 99999 );
                        

                        为你的 5 位随机数

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2018-11-06
                          • 1970-01-01
                          • 2011-03-09
                          • 2014-04-30
                          • 2017-07-31
                          • 1970-01-01
                          相关资源
                          最近更新 更多