Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรมคำนวณความน่าจะเป็นผู้เล่น A ชนะการแข่งขันใน C++

ภาพรวมปัญหา

โปรแกรมนี้คำนวณความน่าจะเป็นที่ผู้เล่น 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)
  • การตัดสินใจภายใต้ความไม่แน่นอน