设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 站长学院 > PHP教程 > 正文

讲解基于PHP实现的各种随机数的实例是怎样的

发布时间:2022-11-17 08:36 所属栏目:121 来源:互联网
导读:
导读:在这篇文章中我们来了解一下基于PHP实现的各种随机数的实例是怎样的,一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就往下看吧! 在网站功能建设中,php随机数是常用的一个
  在这篇文章中我们来了解一下“基于PHP实现的各种随机数的实例是怎样的”,一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就往下看吧!
 
  在网站功能建设中,php随机数是常用的一个功能,比如用户注册时随机产生的验证码、又比如
 
  用户注册时生成随机的一组密码后可自行修改,当用户需要重置密码的时候也需要生成一个随机的密码······随机数就根据特定的规则(或在一个数组范围内)所自动产生的字符串,在php开发中应用广泛,不过php中的随机数也分好几种不同的情况,首先来认识一下PHP提供的随机数函数rand()。
 
  PHP的rand()函数将返回随机整数,具体使用方法如下:
 
  rand(min,max)
 
  可选参数min和max可以使rand() 返回0到RAND_MAX之间的伪随机整数。例如,想要5到15(包括 5 和 15)之间的随机数,用 rand(5, 15)。
 
  下面我来看一个具体的示例,我们做一个基本的函数调用,不设置具体的参数,我们得到的随机数将不受min和max两个参数的限制。
 
  echo(rand());?>
 
  得到的结果:652696728 (随机结果)
 
 
  使用PHP生成指定区间内的随机数
 
  如果我们要生成两个数字之间的随机数,我们需要为rand设定两个参数:
 
  这样,我们得到的结果就在我们的控制之中,他应该是MinNum <= result <= MaxNum;假设我们要使用PHP生成1000到2000之间的随机数,我们的代码应该这样写:
 
  echo(rand(1000,2000));?>
 
  够简单吧,下面来点稍微有些难度的。在本文的开始我们说过,随机数的作用很大,我们可以用PHP随机数解决一些复杂的问题。
 
  使用PHP获得一个集合中的随机元素
 
  将设我们需要从一个数组中获得一个随机元素
 
  $my_array=array('ASP','PHP','JAVASCRIPT','AJAX','CSS','JQUERY','HTML');  
 
  echo($my_array[rand(0,6)]);   
 
  ?>
 
  可以想象,我们得到的结果可能是ASP、PHP或JavaScript等任何一个包含在数组中的元素。注意,我们的my_array数组包含七个元素,我们将rand()的参数设置为0到6之间。
 
  下面我们使用两组随机数对上面的示例做功能增强,我们需要一个随机数进行条件判断,另一个随机数做元素的输出。
 
  $my_array=array('ASP','PHP','JAVASCRIPT','AJAX','CSS','JQUERY','HTML');  
 
  $repetition=rand(0,6);  
 
  for($i=0;$i<=$repetition;$i++){  
 
  echo('I am learning ' . $my_array[rand(0,6)]);  
 
  echo(' on w3cschool.cn');  
 
  }  
 
  ?>
 
  我们得到的结果可能像下面这样:
 
  第一次运行我们得到三条结果

  由于我们使用一个随机数限定显示的条数,所以得到的结果除了文章随机,显示的条数也是随机的,如下图:
 
  第二次运行得到七条结果
 
  接下来是一些php随机数的其他应用方法。
 
  PHP生成32位随机数
 
  使用token的方式,可以控制用户在这个时间内的权限,代码如下:
 
  function genToken( $len = 32, $md5 = true ) {
 
         # Seed random number generator
 
            # Only needed for PHP versions prior to 4.2
 
            mt_srand( (double)microtime()*1000000 );
 
            # Array of characters, adjust as desired
 
            $chars = array(
 
                'Q', '@', '8', 'y', '%', '^', '5', 'Z', '(', 'G', '_', 'O', '`',
 
                'S', '-', 'N', '<', 'D', '{', '}', '[', ']', 'h', ';', 'W', '.',
 
                '/', '|', ':', '1', 'E', 'L', '4', '&', '6', '7', '#', '9', 'a',
 
                'A', 'b', 'B', '~', 'C', 'd', '>', 'e', '2', 'f', 'P', 'g', ')',
 
                '?', 'H', 'i', 'X', 'U', 'J', 'k', 'r', 'l', '3', 't', 'M', 'n',
 
                '=', 'o', '+', 'p', 'F', 'q', '!', 'K', 'R', 's', 'c', 'm', 'T',
 
                'v', 'j', 'u', 'V', 'w', ',', 'x', 'I', '$', 'Y', 'z', '*'
 
            );
 
            # Array indice friendly number of chars;
 
            $numChars = count($chars) - 1; $token = '';
 
            # Create random token at the specified length
 
            for ( $i=0; $i<$len; $i++ )
 
                $token .= $chars[ mt_rand(0, $numChars) ];
 
            # Should token be run through md5?
 
            if ( $md5 ) {
 
                # Number of 32 char chunks
 
                $chunks = ceil( strlen($token) / 32 ); $md5token = '';
 
                # Run each chunk through md5
 
                for ( $i=1; $i<=$chunks; $i++ )
 
                    $md5token .= md5( substr($token, $i * 32 - 32, 32) );
 
                # Trim the token
 
                $token = substr($md5token, 0, $len);
 
            } return $token;
 
        }
 
  php生成N个不重复的随机数
 
  php生成N个不重复的随机数的方法:
 
  需要生成1-25之间的16个不重复的随机数,去填补。
 
     思路:
 
  将随机数存入数组,再在数组中去除重复的值,即可生成一定数量的不重复随机数。
 
  示例代码:
 
  <?php
 
    /*
 
    * array unique_rand( int $min, int $max, int $num )
 
    * 生成一定数量的不重复随机数
 
    * $min 和 $max: 指定随机数的范围
 
    * $num: 指定生成数量
 
    * site
 
    */
 
    function unique_rand($min, $max, $num) {
 
    $count = 0;
 
    $return = array();
 
    while ($count < $num) {
 
    $return[] = mt_rand($min, $max);
 
    $return = array_flip(array_flip($return));
 
    $count = count($return);
 
    }
 
    shuffle($return);
 
    return $return;
 
    }
 
    $arr = unique_rand(1, 25, 16);
 
    sort($arr);
 
    $result = '';
 
    for($i=0; $i < count($arr);$i++)
 
    {
 
    $result .= $arr[$i].',';
 
    }
 
    $result = substr($result, 0, -1);
 
    echo $result;
 
    ?>
 
    运行结果:
 
    2,3,4,6,7,8,9,10,11,12,13,16,20,21,22,24
 
  说明:
 
  生成随机数时用了 mt_rand() 函数。这个函数生成随机数的平均速度要比 rand() 快四倍。
 
  去除数组中的重复值时用了"翻翻法",就是用 array_flip() 把数组的 key 和 value 交换两次。这种做法比用 array_unique() 快得多。
 
     返回数组前,先使用 shuffle() 为数组赋予新的键名,保证键名是 0-n 连续的数字。
 
     若不进行此步骤,可能在删除重复值时造成键名不连续,不利于遍历。
 
  用php成n个随机数,要求n个数的和等于100
 
  $rand_array = array();
 
  function  get_rand_n($rand_array) {
 
      $rand_number = mt_rand(1,9);
 
      if(empty($rand_array)) {
 
          $rand_array[] = $rand_number;
 
          return get_rand_n($rand_array);
 
      } else {
 
          $count = 0;
 
          foreach($rand_array as $item) {
 
              $count += $item;
 
          }
 
          if($count<100) {
 
              if($count+$rand_number == 100) {
 
                  $rand_array[] = $rand_number;
 
                  return $rand_array;
 
              } else if($count+$rand_number < 100) {
 
                  $rand_array[] = $rand_number;
 
                  return get_rand_n($rand_array); // 回掉再次计算
 
              } else { // 如果得到的值大于了100
 
                  return get_rand_n($rand_array); // 重新获得随机数,知道为100的时候返回这个随机数数组
 
              }
 
          }
 
      }
 
  }
 
  $rand_array = get_rand_n($rand_array);
 
  var_dump($rand_array);
 
  运行结果:
 
  php获取四位字母和数字的随机数
 
  我们知道在php中简单的四位数的纯数字验证可以用rand(1000,9999)就可以了,但如果我们要得到字母和数字的随机四位数,那我们该如何写函数呢?下面是一个完整的实例。
 
  <?php
 
  function GetfourStr($len)
 
  {
 
    $chars_array = array(
 
      "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
 
      "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
 
      "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
 
      "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
 
      "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
 
      "S", "T", "U", "V", "W", "X", "Y", "Z",
 
    );
 
    $charsLen = count($chars_array) - 1;
 
    $outputstr = "";
 
    for ($i=0; $i<$len; $i++)
 
    {
 
      $outputstr .= $chars_array[mt_rand(0, $charsLen)];
 
    }
 
    return $outputstr;
 
  }
 
  echo GetfourStr(4);
 
  ?>
 
  如果没有提供可选参数 min 和 max,mt_rand() 返回 0 到 RAND_MAX 之间的伪随机数。例如想要 0 到 46(包括 0 和 46)之间的随机数,用 mt_rand(0, 46)。
 
  php生成指定长度的随机数
 
  <?php   
 
    function get_random($len=3){  
 
    //range 是将10到99列成一个数组   
 
    $numbers = range (10,99);  
 
    //shuffle 将数组顺序随即打乱   
 
    shuffle ($numbers);   
 
    //取值起始位置随机  
 
    $start = mt_rand(1,10);  
 
    //取从指定定位置开始的若干数  
 
    $result = array_slice($numbers,$start,$len);   
 
    $random = "";  
 
    for ($i=0;$i<$len;$i++){   
 
       $random = $random.$result[$i];  
 
     }   
 
     return $random;  
 
   }  
 
  //随机数  
 
  function get_random2($length = 4) {  
 
      $min = pow(10 , ($length - 1));  
 
      $max = pow(10, $length) - 1;  
 
      return mt_rand($min, $max);  
 
  }  
 
    
 
  echo "<br/>";  
 
  echo get_random(3);  
 
  echo "<br/>";  
 
  echo get_random2(6);  
 
  php生成随机密码的三种方法
 
  方法一:
 
  1、在 33 – 126 中生成一个随机整数,如 35,
 
  2、将 35 转换成对应的ASCII码字符 #
 
  3、重复以上 1、2 步骤 n 次,连接成 n 位的密码
 
  该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表; chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。
 
  function create_password($pw_length = 8)
 
  {
 
  $randpwd = '';
 
  for ($i = 0; $i < $pw_length; $i++)
 
  {
 
  $randpwd .= chr(mt_rand(33, 126));
 
  }
 
  return $randpwd;
 
  }
 
  // 调用该函数,传递长度参数$pw_length = 6
 
  echo create_password(6);
 
  方法二:
 
  1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
 
  2、在 $chars 字符串中随机取一个字符
 
  3、重复第二步 n 次,可得长度为 n 的密码
 
  function generate_password( $length = 8 ) {
 
  // 密码字符集,可任意添加你需要的字符
 
  $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
 
  $password = '';
 
  for ( $i = 0; $i < $length; $i++ )
 
  {
 
  // 这里提供两种字符获取方式
 
  // 第一种是使用 substr 截取$chars中的任意一位字符;
 
  // 第二种是取字符数组 $chars 的任意元素
 
  // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
 
  $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
 
  }
 
  return $password;
 
  }
 
  方法三:
 
  1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
 
  2、通过array_rand()从数组 $chars 中随机选出 $length 个元素
 
  3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
 
  function make_password( $length = 8 )
 
  {
 
  // 密码字符集,可任意添加你需要的字符
 
  $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
 
  'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
 
  't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
 
  'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
 
  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z',
 
  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
 
  '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
 
  '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
 
  '.', ';', ':', '/', '?', '|');
 
  // 在 $chars 中随机取 $length 个数组元素键名
 
  $keys = ($chars, $length);
 
  $password = '';
 
  for($i = 0; $i < $length; $i++)
 
  {
 
  // 将 $length 个数组元素连接成字符串
 
  $password .= $chars[$keys[$i]];
 
  }
 
  return $password;
 
  }
 
  时间效率对比
 
  我们使用以下PHP代码,计算上面的 3 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。
 
  <?php
 
  function getmicrotime()
 
  {
 
  list($usec, $sec) = explode(" ",microtime());
 
  return ((float)$usec + (float)$sec);
 
  }
 
  // 记录开始时间
 
  $time_start = getmicrotime();
 
  // 这里放要执行的PHP代码,如:
 
  // echo create_password(6);
 
  // 记录结束时间
 
  $time_end = getmicrotime();
 
  $time = $time_end - $time_start;
 
  // 输出运行总时间
 
  echo "执行时间 $time seconds";
 
  ?>
 
  最终得出的结果是:
 
  方法一:9.8943710327148E-5 秒
 
  方法二:9.6797943115234E-5 秒
 
  方法三:0.00017499923706055 秒
 
  可以看出方法一和方法二的执行时间都差不多,而方法三的运行时间稍微长了点。
 

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读