在 C++ 中,已知擊中目標的機率,求玩家獲勝的機率


在這個問題中,我們給定四個值 p、q、r、s。我們的任務是在給定擊中目標的機率的情況下,找到玩家獲勝的機率。

這裡,我們有兩個玩家正在玩射箭遊戲。玩家 1 擊中目標的機率定義為 p/q。玩家 2 擊中目標的機率定義為 r/s。我們需要找到玩家 1 贏得比賽的機率。

讓我們舉個例子來理解這個問題,

輸入

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

輸出

0.789

解決方案方法

*這種方法需要機率知識。

由於玩家擊中目標的次數沒有上限。兩者都可以擊中目標任意次數,這使得獲勝情況的計算與試驗次數無關。

所以,

假設玩家 1 擊中目標的機率為 P1 = p/q,這使得未擊中的機率為 1 - p/q。

假設玩家 2 擊中目標的機率為 P2 = r/s,這使得未擊中的機率為 1 - r/s。

現在,對於無限次試驗,玩家 1 獲勝的機率可以是,

000win(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) , as R is less than 1.

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

程式說明我們解決方案的工作原理,

示例

 即時演示

#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

更新於: 2021-03-16

145 次檢視

開啟你的 職業生涯

完成課程後獲得認證

立即開始
廣告

© . All rights reserved.