「排列三」是中國體育彩票的熱門玩法之一,「組選三」指從 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,不修改原陣列,效能更佳。「組選三」從 10 個數字(0-9)中選:
C(10,1) = 10 種C(9,1) = 9 種10 × 9 = 90程式輸出 90 組,與理論值吻合。
彩票屬於機率遊戲,任何演算法無法提高中獎概率。 本文僅作為程式演算法教學與邏輯練習,請理性對待彩票,切勿沉迷,量力而行。