在 PHP 中生成指定數量且不重複的隨機數,常見做法是將生成的值存入陣列並去重。本文介紹一種比 array_unique() 更高效的「翻轉法」:利用 array_flip() 將鍵值互換兩次,利用陣列鍵名唯一的特性快速去重,效能顯著優於內建函數。
<?php
/**
* 生成指定範圍內不重複的隨機數陣列
* @param int $min 最小值
* @param int $max 最大值
* @param int $num 生成數量
* @return array 隨機數陣列
*/
function unique_rand($min, $max, $num) {
$count = 0;
$return_arr = array();
while ($count < $num) {
$return_arr[] = mt_rand($min, $max);
// 翻轉法去重:鍵值互換兩次,自動移除重複值
$return_arr = array_flip(array_flip($return_arr));
$count = count($return_arr);
}
shuffle($return_arr); // 打亂順序
return $return_arr;
}
array_flip(array_flip($arr)) 利用鍵名唯一性去重,實測比 array_unique() 快數倍,尤其在大數據量時優勢明顯。rand(1,8)*100
生成 0-100 之間的 8 個隨機小數,如需整數可配合 round() 或 randi()。
=RAND(),按 Ctrl+Enter 批量填充。=RANK(A1,A$1:A$1000),按 Ctrl+Enter 獲得不重複排名序號。此法利用 RANK 函數將隨機小數轉為唯一排名,巧妙避開重複值問題。
$max - $min + 1 < $num 會陷入死循環,建議在函數開頭加入參數校驗。random_int() 替代 mt_rand() 獲取加密級隨機數。