php隨機數(shù)各種知識匯集

2022-05-05 20:41 更新

在網(wǎng)站功能建設(shè)中,php隨機數(shù)是常用的一個功能,比如用戶注冊時隨機產(chǎn)生的驗證碼、又比如

用戶注冊時生成隨機的一組密碼后可自行修改,當(dāng)用戶需要重置密碼的時候也需要生成一個隨機的密碼······隨機數(shù)就根據(jù)特定的規(guī)則(或在一個數(shù)組范圍內(nèi))所自動產(chǎn)生的字符串,在php開發(fā)中應(yīng)用廣泛,不過php中的隨機數(shù)也分好幾種不同的情況,首先來認(rèn)識一下PHP提供的隨機數(shù)函數(shù)rand()。


PHP的rand()函數(shù)將返回隨機整數(shù),具體使用方法如下:

rand(min,max)

可選參數(shù)min和max可以使rand() 返回0到RAND_MAX之間的偽隨機整數(shù)。例如,想要5到15(包括 5 和 15)之間的隨機數(shù),用 rand(5, 15)。



下面我來看一個具體的示例,我們做一個基本的函數(shù)調(diào)用,不設(shè)置具體的參數(shù),我們得到的隨機數(shù)將不受min和max兩個參數(shù)的限制。

echo(rand());?> 
得到的結(jié)果:652696728 (隨機結(jié)果)

php隨機數(shù)

使用PHP生成指定區(qū)間內(nèi)的隨機數(shù)

如果我們要生成兩個數(shù)字之間的隨機數(shù),我們需要為rand設(shè)定兩個參數(shù):

這樣,我們得到的結(jié)果就在我們的控制之中,他應(yīng)該是MinNum <= result <= MaxNum;假設(shè)我們要使用PHP生成1000到2000之間的隨機數(shù),我們的代碼應(yīng)該這樣寫:
echo(rand(1000,2000));?> 
夠簡單吧,下面來點稍微有些難度的。在本文的開始我們說過,隨機數(shù)的作用很大,我們可以用PHP隨機數(shù)解決一些復(fù)雜的問題。

使用PHP獲得一個集合中的隨機元素

將設(shè)我們需要從一個數(shù)組中獲得一個隨機元素
$my_array=array('ASP','PHP','JAVASCRIPT','AJAX','CSS','JQUERY','HTML');  
echo($my_array[rand(0,6)]);   
?> 
可以想象,我們得到的結(jié)果可能是ASP、PHP或JavaScript等任何一個包含在數(shù)組中的元素。注意,我們的my_array數(shù)組包含七個元素,我們將rand()的參數(shù)設(shè)置為0到6之間。

下面我們使用兩組隨機數(shù)對上面的示例做功能增強,我們需要一個隨機數(shù)進行條件判斷,另一個隨機數(shù)做元素的輸出。
$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');  
}  
?> 
我們得到的結(jié)果可能像下面這樣:

隨機元素
第一次運行我們得到三條結(jié)果


由于我們使用一個隨機數(shù)限定顯示的條數(shù),所以得到的結(jié)果除了文章隨機,顯示的條數(shù)也是隨機的,如下圖:

隨機數(shù)運行結(jié)果
第二次運行得到七條結(jié)果

接下來是一些php隨機數(shù)的其他應(yīng)用方法。

PHP生成32位隨機數(shù)

使用token的方式,可以控制用戶在這個時間內(nèi)的權(quán)限,代碼如下:
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;
      }

N個不重復(fù)的隨機數(shù)

php生成N個不重復(fù)的隨機數(shù)

php生成N個不重復(fù)的隨機數(shù)的方法:
需要生成1-25之間的16個不重復(fù)的隨機數(shù),去填補。
  
思路:
將隨機數(shù)存入數(shù)組,再在數(shù)組中去除重復(fù)的值,即可生成一定數(shù)量的不重復(fù)隨機數(shù)。

示例代碼:
<?php
  /*
  * array unique_rand( int $min, int $max, int $num )
  * 生成一定數(shù)量的不重復(fù)隨機數(shù)
  * $min 和 $max: 指定隨機數(shù)的范圍
  * $num: 指定生成數(shù)量
  * 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;
  ?>
  運行結(jié)果:
  2,3,4,6,7,8,9,10,11,12,13,16,20,21,22,24

說明:
生成隨機數(shù)時用了 mt_rand() 函數(shù)。這個函數(shù)生成隨機數(shù)的平均速度要比 rand() 快四倍。

去除數(shù)組中的重復(fù)值時用了"翻翻法",就是用 array_flip() 把數(shù)組的 key 和 value 交換兩次。這種做法比用 array_unique() 快得多。
  
返回數(shù)組前,先使用 shuffle() 為數(shù)組賦予新的鍵名,保證鍵名是 0-n 連續(xù)的數(shù)字。
  
若不進行此步驟,可能在刪除重復(fù)值時造成鍵名不連續(xù),不利于遍歷。

用php成n個隨機數(shù),要求n個數(shù)的和等于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); // 重新獲得隨機數(shù),知道為100的時候返回這個隨機數(shù)數(shù)組
            }
        }
    }
}
$rand_array = get_rand_n($rand_array);
var_dump($rand_array);
運行結(jié)果:



php獲取四位字母和數(shù)字的隨機數(shù)

我們知道在php中簡單的四位數(shù)的純數(shù)字驗證可以用rand(1000,9999)就可以了,但如果我們要得到字母和數(shù)字的隨機四位數(shù),那我們該如何寫函數(shù)呢?下面是一個完整的實例。
<?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);
?>
如果沒有提供可選參數(shù) min 和 max,mt_rand() 返回 0 到 RAND_MAX 之間的偽隨機數(shù)。例如想要 0 到 46(包括 0 和 46)之間的隨機數(shù),用 mt_rand(0, 46)。	

指定長度的隨機數(shù)

php生成指定長度的隨機數(shù)

<?php   
  function get_random($len=3){  
  //range 是將10到99列成一個數(shù)組   
  $numbers = range (10,99);  
  //shuffle 將數(shù)組順序隨即打亂   
  shuffle ($numbers);   
  //取值起始位置隨機  
  $start = mt_rand(1,10);  
  //取從指定定位置開始的若干數(shù)  
  $result = array_slice($numbers,$start,$len);   
  $random = "";  
  for ($i=0;$i<$len;$i++){   
     $random = $random.$result[$i];  
   }   
   return $random;  
 }  
  
//隨機數(shù)  
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 中生成一個隨機整數(shù),如 35,

2、將 35 轉(zhuǎn)換成對應(yīng)的ASCII碼字符 # 

3、重復(fù)以上 1、2 步驟 n 次,連接成 n 位的密碼

該算法主要用到了兩個函數(shù),mt_rand ( int $min , int $max )函數(shù)用于生成隨機整數(shù),其中 $min – $max 為 ASCII 碼的范圍,這里取 33 -126 ,可以根據(jù)需要調(diào)整范圍,如ASCII碼表中 97 – 122 位對應(yīng) a – z 的英文字母,具體可參考 ASCII碼表; chr ( int $ascii )函數(shù)用于將對應(yīng)整數(shù) $ascii 轉(zhuǎn)換成對應(yīng)的字符。
function create_password($pw_length = 8)
{
$randpwd = '';
for ($i = 0; $i < $pw_length; $i++)
{
$randpwd .= chr(mt_rand(33, 126));
}
return $randpwd;
}
// 調(diào)用該函數(shù),傳遞長度參數(shù)$pw_length = 6
echo create_password(6);

方法二:

1、預(yù)置一個的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符

2、在 $chars 字符串中隨機取一個字符

3、重復(fù)第二步 n 次,可得長度為 n 的密碼
function generate_password( $length = 8 ) {
// 密碼字符集,可任意添加你需要的字符
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
$password = '';
for ( $i = 0; $i < $length; $i++ )
{
// 這里提供兩種字符獲取方式
// 第一種是使用 substr 截取$chars中的任意一位字符;
// 第二種是取字符數(shù)組 $chars 的任意元素
// $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
$password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
}
return $password;
}

方法三:

1、預(yù)置一個的字符數(shù)組 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符

2、通過array_rand()從數(shù)組 $chars 中隨機選出 $length 個元素

3、根據(jù)已獲取的鍵名數(shù)組 $keys,從數(shù)組 $chars 取出字符拼接字符串。該方法的缺點是相同的字符不會重復(fù)取。
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 個數(shù)組元素鍵名
$keys = ($chars, $length);
$password = '';
for($i = 0; $i < $length; $i++)
{
// 將 $length 個數(shù)組元素連接成字符串
$password .= $chars[$keys[$i]];
}
return $password;
}

時間效率對比

我們使用以下PHP代碼,計算上面的 3 個隨機密碼生成函數(shù)生成 6 位密碼的運行時間,進而對他們的時間效率進行一個簡單的對比。
<?php
function getmicrotime()
{
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
// 記錄開始時間
$time_start = getmicrotime();
// 這里放要執(zhí)行的PHP代碼,如:
// echo create_password(6);
// 記錄結(jié)束時間
$time_end = getmicrotime();
$time = $time_end - $time_start;
// 輸出運行總時間
echo "執(zhí)行時間 $time seconds";
?>

最終得出的結(jié)果是:

方法一:9.8943710327148E-5 秒
方法二:9.6797943115234E-5 秒
方法三:0.00017499923706055 秒
可以看出方法一和方法二的執(zhí)行時間都差不多,而方法三的運行時間稍微長了點。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號