ภาพรวมปัญหา
โปรแกรมนี้คำนวณความน่าจะเป็นที่ผู้เล่น A จะชนะการแข่งขัน โดยที่:
- ความน่าจะเป็น A ทำประตูได้: a/b
- ความน่าจะเป็น B ทำประตูได้: c/d
- ผู้ที่ทำประตูได้ก่อนจะชนะ
- A เล่นก่อนเสมอ
การวิเคราะห์ทางความน่าจะเป็น
นี่คือปัญหาลำดับเรขาคณิต (Geometric Series)
เหตุการณ์ที่ A ชนะ:
- รอบที่ 1: A ทำได้ → ความน่าจะเป็น = a/b
- รอบที่ 2: A หาย, B หาย, A ทำได้ → (1-a/b)(1-c/d)(a/b)
- รอบที่ 3: A หาย, B หาย, A หาย, B หาย, A ทำได้ → [(1-a/b)(1-c/d)]²(a/b)
- ...
ผลรวมอนันต์:
P(A wins) = (a/b) + (1-a/b)(1-c/d)(a/b) + [(1-a/b)(1-c/d)]²(a/b) + ...
= (a/b) / [1 - (1-a/b)(1-c/d)]
= (a/b) / [a/b + c/d - (a/b)(c/d)]
สูตรสุดท้าย
P(A wins) = (a/b) / (a/b + c/d - (a/b)*(c/d))
ตัวอย่างโค้ด C++
#include <iostream>
#include <iomanip>
using namespace std;
double probabilityAWins(int a, int b, int c, int d) {
double pA = static_cast(a) / b;
double pB = static_cast(c) / d;
// สูตร: pA / (pA + pB - pA*pB)
double denominator = pA + pB - pA * pB;
if (denominator == 0) return 0; // กันหารศูนย์
return pA / denominator;
}
int main() {
// ตัวอย่างที่ 1
int a = 10, b = 20, c = 30, d = 40;
cout << fixed << setprecision(4);
cout << "a=" << a << ", b=" << b << ", c=" << c << ", d=" << d << endl;
cout << "P(A wins) = " << probabilityAWins(a, b, c, d) << endl;
// pA = 0.5, pB = 0.75
// P = 0.5 / (0.5 + 0.75 - 0.375) = 0.5 / 0.875 = 0.5714...
cout << endl;
// ตัวอย่างที่ 2
a = 1, b = 2, c = 10, d = 11;
cout << "a=" << a << ", b=" << b << ", c=" << c << ", d=" << d << endl;
cout << "P(A wins) = " << probabilityAWins(a, b, c, d) << endl;
// pA = 0.5, pB = 10/11 ≈ 0.9091
// P = 0.5 / (0.5 + 0.9091 - 0.4545) = 0.5 / 0.9545 = 0.5238...
cout << endl;
// กรณีพิเศษ: ทั้งคู่มีโอกาสเท่ากัน
a = 1, b = 2, c = 1, d = 2;
cout << "Equal probability (1/2 each):" << endl;
cout << "P(A wins) = " << probabilityAWins(a, b, c, d) << endl;
// P = 0.5 / (0.5 + 0.5 - 0.25) = 0.5 / 0.75 = 2/3 ≈ 0.6667
// A มีข้อได้เปรียบเพราะเล่นก่อน
return 0;
}
ผลลัพธ์ตัวอย่าง
a=10, b=20, c=30, d=40 P(A wins) = 0.5714 a=1, b=2, c=10, d=11 P(A wins) = 0.5238 Equal probability (1/2 each): P(A wins) = 0.6667
หมายเหตุเกี่ยวกับโค้ดต้นฉบับ
โค้ดต้นฉบับมีสูตรที่ผิดพลาด:
return (e * (1 / (1 - (1 - f) * (1 - f))));
สูตรที่ถูกต้องควรเป็น:
return e / (1 - (1 - e) * (1 - f));
หรือในรูปแบบที่ง่ายกว่า: e / (e + f - e*f)
ความซับซ้อนของอัลกอริทึม
- เวลา: O(1) - คำนวณสูตรโดยตรง
- พื้นที่: O(1)
การประยุกต์ใช้
- การวิเคราะห์เกมส์และกีฬา
- ทฤษฎีคิว (Queueing Theory)
- การตัดสินใจภายใต้ความไม่แน่นอน