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

หาความน่าจะเป็นที่ผู้เล่นชนะเมื่อทราบความน่าจะเป็นการยิงถูกเป้าใน C++

ในปัญหานี้ เราได้รับค่าสี่ค่า p, q, r, s งานของเราคือ หาความน่าจะเป็นที่ผู้เล่นชนะเมื่อทราบความน่าจะเป็นการยิงถูกเป้า

ที่นี่ เรามีผู้เล่นสองคนที่เล่นเกมยิงธนู ความน่าจะเป็นของผู้เล่น 1 ยิงถูกเป้าถูกกำหนดเป็น p/q ความน่าจะเป็นของผู้เล่น 2 ยิงถูกเป้าถูกกำหนดเป็น r/s เราต้องหาความน่าจะเป็นของผู้เล่น 1 ชนะเกม

มาดูตัวอย่างเพื่อเข้าใจปัญหา

Input

p = 3, q = 5, r = 2, s = 5

Output

0.789

วิธีแก้ปัญหา

วิธีนี้ต้องการความรู้เกี่ยวกับความน่าจะเป็น

เนื่องจากไม่มีขีดจำกัดสูงสุดของจำนวนครั้งที่ผู้เล่นได้โอกาสยิงเป้า ทั้งสองสามารถยิงถูกเป้าได้ไม่จำกัดจำนวนครั้ง ทำให้การคำนวณสถานการณ์ชนะเป็นอิสระจากจำนวนการทดลอง

ดังนั้น

สมมติความน่าจะเป็นผู้เล่น 1 ยิงถูกคือ P1 = p/q ทำให้ความน่าจะเป็นพลาดคือ 1 - p/q

สมมติความน่าจะเป็นผู้เล่น 2 ยิงถูกคือ P2 = r/s ทำให้ความน่าจะเป็นพลาดคือ 1 - r/s

ตอนนี้ สำหรับจำนวนการทดลองอนันต์ ความน่าจะเป็นผู้เล่น 1 ชนะคือ

win(P1) + (lost(P1)*lost(P2)*win(P1)) + (lost(P1)*lost(P2)*lost(P1)*lost(P2)*win(P1)) + ...

ซึ่งสามารถเขียนในรูปสูตรได้ว่า

P1 + ((1 - P1)*(1 - P2)*(P1)) + ((1 - P1)*(1 - P2)*(1 - P1)*(1 - P2)*(P1)) ...

นี่คืออนุกรมเรขาคณิตอนันต์ โดยที่

A = P1 
R = [(1 - P1)*(1 - P2)]

ผลรวมจะเป็น

S = A / (1 - R)  เนื่องจาก R น้อยกว่า 1

$$S=\frac{\frac{p}{q}}{1-(1-\frac{p}{q})*(1-\frac{r}{s})}$$

โปรแกรมแสดงการทำงานของวิธีแก้

ตัวอย่าง

#include <iostream> 
using namespace std; 

double calcWinningPropP1(double p, double q, double r, double s){ 
    return (p / q) / (1 - ( (1 - (p/q)) * (1 - (r/s)) ) ); 
} 

int main() { 
    double p = 3, q = 5, r = 2, s = 5; 
    cout<<"The probability of player 1 winning is "<<calcWinningPropP1(p, q, r, s); 
    return 0; 
}

ผลลัพธ์

The probability of player 1 winning is 0.789474