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

PHP 數組隨機打亂:自定義實現與內置 shuffle 對比

     編輯:PHP 相關知識

PHP 數組隨機打亂:自定義實現與內置 shuffle 對比

PHP 內置 shuffle() 已高度優化,但理解其背後演算法有助於面試與特殊場景(如需確定性種子)。本文展示一個基於「隨機索引插入」的自定義實現,並對比效能。

自定義隨機打亂函數

function randomizeArray(array $array): array {
    $result = [];
    $max = count($array) + 10; // 擴大索引空間減少碰撞

    while (!empty($array)) {
        $element = array_shift($array);
        $idx = random_int(0, $max);
        while (isset($result[$idx])) {
            $idx = random_int(0, $max);
        }
        $result[$idx] = $element;
    }

    ksort($result); // 按索引排序
    return array_values($result); // 重置鍵名
}

使用範例

$arr = ['why', 'dont', 'visit', 'www', 'jonas', 'john', 'de', ':-)'];
echo "原始: " . implode(', ', $arr) . "\n";
echo "打亂: " . implode(', ', randomizeArray($arr)) . "\n";

// 內置函數一行搞定
shuffle($arr);
echo "shuffle: " . implode(', ', $arr) . "\n";

演算法分析

  • 時間複雜度:平均 O(n),最差 O(n²)(索引碰撞極端情況)
  • 空間複雜度:O(n)
  • shuffle() 使用 Fisher-Yates 洗牌演算法,原地操作,O(n) 且無額外空間,效能更優。

進階:可復現的隨機(指定種子)

function seededShuffle(array &$array, int $seed): void {
    mt_srand($seed);
    $n = count($array);
    for ($i = $n - 1; $i > 0; $i--) {
        $j = mt_rand(0, $i);
        [$array[$i], $array[$j]] = [$array[$j], $array[$i]];
    }
}

適用於測試、遊戲邏輯、分佈式一致性分片等場景。

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