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

PHP 實作:從 1 到 9 隨機取三數總和為 15 的機率分析

     編輯:PHP 相關知識

問題背景

這是一個經典的組合數學與程式模擬練習:從 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);

關鍵改進點

  • random_int() 取代 rand():PHP 7+ 提供密碼學安全的隨機整數,分布更均勻。
  • 嚴格比較 ===:避免型別轉換導致的邏輯錯誤。
  • 計數器分離:清楚區分「有重複」與「無重複」兩種子情況。

數學驗證(理論值)

所有有序三元組共有 9³ = 729 種。窮舉所有組合可得:

  • 總和為 15 的組合:61 種
  • 其中含重複數字:19 種(如 5+5+5、4+4+7 等)
  • 無重複數字:42 種
  • 理論機率:61/729 ≈ 8.37%

模擬 10 萬次結果通常在 8.2%~8.5% 之間,符合大數法則。

擴充應用

  • 改為 不重複抽樣:使用 shuffle() 或 array_rand() 從 1~9 陣列抽 3 個不重複數字。
  • 泛化為 N 個數字總和為 M:引入遞迴或動態規劃演算法。
  • 結合 前端圖表(Chart.js)即時顯示機率收斂曲線。

完整可執行版本

<?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";
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved