Find probability that a player wins when probabilities of hitting the target are given

Given four integers p, q, r and s. Two players are playing a game where both the players are hitting a target and the first player who hits the target wins the game, the probability of the first player hitting the target is p / q and as that of second player hitting the target is r / s. The task is to find the probability of the first player winning the game.

Examples:

Input: p = 1, q = 4, r = 3, s = 4
Output: 0.307692308

Input: p = 1, q = 2, r = 1, s = 2
Output: 0.666666667

Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: The probability of the first player hitting the target is p / q and missing the target is 1 – p / q.
The probability of the second player hitting the target is r / s and missing the target is 1 – r / s.
Let, the first player be x and the second player be y.
So the total probability will be x won + (x lost * y lost * x won) + (x lost * y lost * x lost * y lost * x won) + … so on.
Because x can win in any turn, Its an infinite sequence.
Let t = (1 – p / q) * (1 – r / s). Here t < 1 as p / q and r / s are always <1.
So the series will become, p / q + (p / q) * t + (p / q) * t2 + …
This is an infinite GP series with common ratio less than 1 and it’s sum will be (p / q) / (1 – t).

Below is the implementation of the above approach:

C++

 // C++ implementation of the approach #include using namespace std;    // Function to return the probability of the winner double find_probability(double p, double q,                         double r, double s) {        double t = (1 - p / q) * (1 - r / s);        double ans = (p / q) / (1 - t);        return ans; }    // Driver Code int main() {     double p = 1, q = 2, r = 1, s = 2;        // Will print 9 digits after the decimal point     cout << fixed << setprecision(9)          << find_probability(p, q, r, s);        return 0; }

Java

 // Java implementation of the approach import java.util.*; import java.text.DecimalFormat;    class solution {    // Function to return the probability of the winner static double find_probability(double p, double q,                         double r, double s) {        double t = (1 - p / q) * (1 - r / s);        double ans = (p / q) / (1 - t);        return ans; }    // Driver Code public static void main(String args[]) {     double p = 1, q = 2, r = 1, s = 2;        // Will print 9 digits after the decimal point     DecimalFormat dec = new DecimalFormat("#0.000000000");     System.out.println(dec.format(find_probability(p, q, r, s))); } } // This code is contributed by // Surendra_Gangwar

Python3

 # Python3 implementation of the approach     # Function to return the probability # of the winner  def find_probability(p, q, r, s) :            t = (1 - p / q) * (1 - r / s)        ans = (p / q) / (1 - t);         return round(ans, 9)    # Driver Code  if __name__ == "__main__" :         p, q, r, s = 1, 2, 1, 2        # Will print 9 digits after      # the decimal point      print(find_probability(p, q, r, s))     # This code is contributed by Ryuga

C#

 // C# mplementation of the approach using System;    class GFG {    // Function to return the probability of the winner static double find_probability(double p, double q,                         double r, double s) {        double t = (1 - p / q) * (1 - r / s);        double ans = (p / q) / (1 - t);        return ans; }    // Driver Code public static void Main() {     double p = 1, q = 2, r = 1, s = 2;     Console.WriteLine(find_probability(p, q, r, s)); } }    // This code is contributed by // anuj_67..

PHP



Output:

0.666666667

My Personal Notes arrow_drop_up Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.