這是一個經典的組合數學與程式模擬練習:從 1~9 中任意抽取三個數(可重複),總和等於 15 的組合有哪些?透過 PHP 模擬十萬次實驗,觀察機率分布與重複值情況。
<?php
$total = 100000; // 模擬次數
$sum15 = 0; // 總和為 15 的次數
$dup = 0; // 含重複數字的次數
$unique = 0; // 無重複數字的次數
for ($i = 0; $i < $total; $i++) {
$a = random_int(1, 9);
$b = random_int(1, 9);
$c = random_int(1, 9);
if ($a + $b + $c === 15) {
$sum15++;
if ($a === $b || $a === $c || $b === $c) {
$dup++;
} else {
$unique++;
}
}
}
printf("總模擬次數: %d\n", $total);
printf("總和=15 次數: %d (%.2f%%)\n", $sum15, $sum15/$total*100);
printf(" 含重複: %d\n", $dup);
printf(" 全不重複: %d\n", $unique);
所有有序三元組共有 9³ = 729 種。窮舉所有組合可得:
模擬 10 萬次結果通常在 8.2%~8.5% 之間,符合大數法則。
shuffle() 或 array_rand() 從 1~9 陣列抽 3 個不重複數字。<?php
function simulate(int $trials = 100000): array {
$stats = ['sum15' => 0, 'dup' => 0, 'unique' => 0];
for ($i = 0; $i < $trials; $i++) {
$nums = [random_int(1,9), random_int(1,9), random_int(1,9)];
if (array_sum($nums) === 15) {
$stats['sum15']++;
$stats[count(array_unique($nums)) === 3 ? 'unique' : 'dup']++;
}
}
return $stats;
}
$res = simulate(200000);
echo "總和=15: {$res['sum15']} 次\n";
echo " 含重複: {$res['dup']}\n";
echo " 無重複: {$res['unique']}\n";