在 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 次查看

开启你的 职业生涯

完成课程后获得认证

立即开始
广告