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



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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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..

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP implementation of the approach
  
// Function to return the probability
// of the winner
function find_probability($p, $q, $r, $s)
{
    $t = (1 - $p / $q) * (1 - $r / $s);
  
    $ans = ($p / $q) / (1 - $t);
  
    return $ans;
}
  
// Driver Code
$p = 1; $q = 2;
$r = 1; $s = 2;
  
// Will print 9 digits after 
// the decimal point
$res = find_probability($p, $q, $r, $s);
$update = number_format($res, 7);
echo $update;
  
// This code is contributed by Rajput-Ji
?>

chevron_right


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.