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

PHP 生成 N 個不重複隨機數的高效函數實現

     編輯:PHP 相關知識

核心思路:翻轉法去重 + mt_rand 高性能生成

在 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;
}

關鍵優化點解析

  1. mt_rand() 比 rand() 快 4 倍:採用梅森旋轉演算法,產生隨機數速度更快、周期更長。
  2. 翻轉法去重:array_flip(array_flip($arr)) 利用鍵名唯一性去重,實測比 array_unique() 快數倍,尤其在大數據量時優勢明顯。
  3. shuffle() 打亂:確保輸出順序隨機,避免因去重導致的順序規律性。

其他語言/工具的對應方案

MATLAB

rand(1,8)*100

生成 0-100 之間的 8 個隨機小數,如需整數可配合 round() 或 randi()。

Excel

  1. 選中 A1:A1000,輸入 =RAND(),按 Ctrl+Enter 批量填充。
  2. 選中 B1:B1000,輸入 =RANK(A1,A$1:A$1000),按 Ctrl+Enter 獲得不重複排名序號。

此法利用 RANK 函數將隨機小數轉為唯一排名,巧妙避開重複值問題。

適用場景與注意事項

  • 適用於抽獎、驗證碼、測試數據生成等需「不重複」的業務。
  • 若 $max - $min + 1 < $num 會陷入死循環,建議在函數開頭加入參數校驗。
  • PHP 7+ 環境下可進一步優化:改用 random_int() 替代 mt_rand() 獲取加密級隨機數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved