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

PHP 洗牌算法實作:費雪-耶茨演算法高效打亂陣列

     編輯:PHP 相關知識

洗牌算法是將有序序列隨機打亂的經典問題。本文介紹基於 費雪-耶茨演算法 的 PHP 實作,時間複雜度 O(n),空間複雜度 O(n),是實現公平洗牌、隨機排序的標準做法。

程式碼實作

<?php
/**
 * 簡單洗牌算法 - 費雪-耶茨演算法
 * @param int $card_num 牌數/陣列長度
 * @return array 打亂後的索引陣列
 */
function wash_card($card_num) {
    $cards = $tmp = [];
    // 初始化有序陣列
    for ($i = 0; $i < $card_num; $i++) {
        $tmp[$i] = $i;
    }

    // 核心洗牌邏輯
    for ($i = 0; $i < $card_num; $i++) {
        $index = rand(0, $card_num - $i - 1);
        $cards[$i] = $tmp[$index];
        unset($tmp[$index]);
        $tmp = array_values($tmp); // 重新索引
    }
    return $cards;
}

// 測試:54 張撲克牌洗牌
print_r(wash_card(54));
?>

演算法原理圖解

費雪-耶茨演算法(Fisher-Yates Shuffle)的核心思想:

  1. 從最後一個元素開始,向前遍歷陣列
  2. 對於第 i 個位置,從 [0, i] 範圍隨機選一個索引 j
  3. 交換位置 i 和 j 的元素
  4. 每個元素都有等概率被放到任意位置,確保排列均勻隨機

PHP 內建函式替代方案

實際專案中,推薦直接使用 PHP 內建的 shuffle() 或 array_rand():

$cards = range(0, 53);
shuffle($cards); // 原地打亂,O(n) 時間複雜度
// 或取隨機鍵值
$random_keys = array_rand($cards, 5);

shuffle() 內部同樣採用費雪-耶茨演算法,效能經 C 層優化,比用戶空間實作更快。

應用場景

  • 線上撲克/麻將遊戲發牌邏輯
  • 問卷選項隨機排序防作弊
  • 抽獎池獎品順序隨機化
  • 測試資料隨機排列組合

注意事項

範例中使用 rand(),PHP 7.1+ 起 rand() 已為 mt_rand() 別名。若需加密級隨機性(如博彩系統),請改用 random_int()。另請留意 array_values() 在大陣列中會有效能開銷,實際專案可優化為指標交換方式。

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