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

體育彩票排列三組選三演算法 PHP 實作解析

     編輯:PHP 綜合知識

前言

「排列三」是中國體育彩票的熱門玩法之一,「組選三」指從 0-9 十個數字中選擇三個號碼,其中兩個相同、一個不同(如 1,1,2),開獎號碼順序不限,只要包含這三個數字即中獎。本文將解析一個 PHP 函式,用於生成所有可能的「組選三」號碼組合,並說明其演算法邏輯與優化方向。

演算法核心邏輯

給定一組基礎數字陣列(如 [1,2,3,4]),目標是產生所有符合「兩個相同、一個不同」模式的三位數組合。例如以 1 為重複數字,其餘數字 2,3,4 各自與之組合,產生 [2,1,1]、[3,1,1]、[4,1,1];再以 2 為重複數字,產生 [1,2,2]、[3,2,2]、[4,2,2],以此類推。

原始程式碼與輸出結果

function arrange($arr) {
    $new_arr = array();
    $c = count($arr);
    foreach ($arr as $key => $vo) {
        $lin = $arr;
        array_splice($lin, $key, 1); // 移除當前元素,剩餘為候選「不同數字」
        for ($l = 0; $l < $c - 1; $l++) {
            $larr = array();
            $larr[] = $lin[$l];      // 不同的數字
            $larr[] = $vo;           // 重複數字(第一位)
            $larr[] = $vo;           // 重複數字(第二位)
            $new_arr[] = $larr;
        }
    }
    return $new_arr;
}

$arr = array(1, 2, 3, 4);
$r = arrange($arr);
print_r($r);

輸出結果

Array
(
    [0] => Array ( [0] => 2, [1] => 1, [2] => 1 )
    [1] => Array ( [0] => 3, [1] => 1, [2] => 1 )
    [2] => Array ( [0] => 4, [1] => 1, [2] => 1 )
    [3] => Array ( [0] => 1, [1] => 2, [2] => 2 )
    [4] => Array ( [0] => 3, [1] => 2, [2] => 2 )
    [5] => Array ( [0] => 4, [1] => 2, [2] => 2 )
    [6] => Array ( [0] => 1, [1] => 3, [2] => 3 )
    [7] => Array ( [0] => 2, [1] => 3, [2] => 3 )
    [8] => Array ( [0] => 4, [1] => 3, [2] => 3 )
    [9] => Array ( [0] => 1, [1] => 4, [2] => 4 )
    [10] => Array ( [0] => 2, [1] => 4, [2] => 4 )
    [11] => Array ( [0] => 3, [1] => 4, [2] => 4 )
)

共 12 組,符合排列組合公式:n * (n-1),其中 n=4。

程式碼優化與現代化重寫

/**
 * 生成排列三「組選三」所有組合
 * @param array $numbers 可選數字池(如 range(0,9))
 * @return array 三元組陣列,格式 [不同數字, 重複數字, 重複數字]
 */
function generateGroupSelect3(array $numbers): array {
    $result = [];
    $count = count($numbers);

    foreach ($numbers as $idx => $repeatNum) {
        // 建立不包含當前重複數字的候選池
        $candidates = array_merge(
            array_slice($numbers, 0, $idx),
            array_slice($numbers, $idx + 1)
        );

        foreach ($candidates as $singleNum) {
            $result[] = [$singleNum, $repeatNum, $repeatNum];
        }
    }
    return $result;
}

// 使用範例:0-9 全數字池
$allNumbers = range(0, 9);
$combinations = generateGroupSelect3($allNumbers);
echo "總組合數:" . count($combinations) . PHP_EOL; // 90 組
// print_r($combinations);

改進要點

  • 語意化命名:arrange → generateGroupSelect3,參數與變數名稱更具描述性。
  • 避免重複複製陣列:使用 array_slice 替代 array_splice,不修改原陣列,效能更佳。
  • 型別宣告與回傳型別:PHP 7.1+ 支援標量型別提示,增強程式碼健壯性。
  • 支援任意數字池:不限於 1-4,可直接套用至 0-9 完整號碼範圍。

數學驗證

「組選三」從 10 個數字(0-9)中選:

  • 選 1 個作為重複數字:C(10,1) = 10 種
  • 從剩餘 9 個中選 1 個作為不同數字:C(9,1) = 9 種
  • 總組合數 = 10 × 9 = 90

程式輸出 90 組,與理論值吻合。

擴展應用場景

  1. 號碼篩選輔助:結合歷史開獎資料,統計各組合出現頻率,輔助選號決策(僅供娛樂參考)。
  2. 投注單自動生成:配合「膽拖」、「和值」、「跨度」等條件過濾,輸出機選號碼。
  3. 教學示範:作為組合數學與程式設計結合的經典案例。

重要提醒

彩票屬於機率遊戲,任何演算法無法提高中獎概率。 本文僅作為程式演算法教學與邏輯練習,請理性對待彩票,切勿沉迷,量力而行。

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