Skip to content
Related Articles

Related Articles

Improve Article
Find probability that a player wins when probabilities of hitting the target are given
  • Last Updated : 25 May, 2021

Given four integers p, q, r, and s. Two players are playing a game where both the players hit 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 that of the 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 is 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 at any turn, it’s 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 a common ratio of less than 1 and its sum will be (p / q) / (1 – t).



Below is the implementation of the above approach:  

C++




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

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




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

Javascript




<script>
 
 
// Javascript implementation of the approach
 
// Function to return the probability of the winner
function find_probability(p, q, r, s)
{
 
    var t = (1 - p / q) * (1 - r / s);
 
    var ans = (p / q) / (1 - t);
 
    return ans;
}
 
// Driver Code
var p = 1, q = 2, r = 1, s = 2;
// Will print 9 digits after the decimal point
document.write( find_probability(p, q, r, s).toFixed(9));
 
 
</script>
Output: 
0.666666667

 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with industry experts, please refer Geeks Classes Live




My Personal Notes arrow_drop_up
Recommended Articles
Page :