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+slice | O(n) | 範圍中等、需少量唯一值 ✅ 首選 |
| array_rand | O(k) | 範圍大、需大量唯一值(k 接近 n 時退化) |
| mt_rand+unique | 不定 | 範圍極大、需極少值(如 1-1億取 3 個) |
根據業務規模選擇最優姿勢,避免踩坑。