首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 生成不重複隨機數的 5 種高效方法:範圍打亂、陣列隨機鍵、唯一值過濾

     編輯:PHP 相關知識

PHP 生成不重複隨機數的 5 種高效方法

Web、WAP、App 開發中隨機數需求無處不在。本文匯總 5 種常用姿勢,從「範圍打亂」到「唯一值過濾」,附代碼與適用場景分析。

方法一:range() + shuffle() + array_slice() —— 最推薦

$numbers = range(1, 50);
shuffle($numbers);
$result = array_slice($numbers, 0, 6); // 取前 6 個
print_r($result);

優點:代碼極簡、均勻分布、無重複、性能優。適用:範圍較小(<10萬)需取少量數。

方法二:srand() + shuffle() + list()/each() —— 經典寫法

$numbers = range(1, 20);
srand((float)microtime() * 1000000); // 可選,現代 PHP 自動播種
shuffle($numbers);
while (list(, $number) = each($numbers)) {
    echo "$number ";
}

注意:each() 已棄用(PHP 7.2+),建議改用 foreach。

方法三:封裝通用函數 NoRand($begin, $end, $limit)

function NoRand($begin = 0, $end = 20, $limit = 5) {
    $arr = range($begin, $end);
    shuffle($arr);
    return array_slice($arr, 0, $limit);
}
print_r(NoRand()); // 1-20 間 5 個不重複隨機數

方法四:mt_rand() + array_unique() 循環去重

$tmp = [];
while (count($tmp) < 5) {
    $tmp[] = mt_rand(1, 20);
    $tmp = array_unique($tmp);
}
print_r($tmp);

缺點:範圍大、需求量大時衝突概率高,循環次數不可控,性能不可預測。

方法五:array_rand() 直接抽取鍵名 —— 最簡潔

$tmp = range(1, 30);
print_r(array_rand($tmp, 10)); // 返回 10 個隨機鍵(即 0-29 的索引)

注意:返回的是鍵名而非值;若 range 指定了步長,需確保第二參數不超過陣列長度。


性能與選型建議

方法時間複雜度適用場景
range+shuffle+sliceO(n)範圍中等、需少量唯一值 ✅ 首選
array_randO(k)範圍大、需大量唯一值(k 接近 n 時退化)
mt_rand+unique不定範圍極大、需極少值(如 1-1億取 3 個)

根據業務規模選擇最優姿勢,避免踩坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved