Probability that the sum of all numbers obtained on throwing a dice N times lies between two given integers

• Difficulty Level : Hard
• Last Updated : 15 Nov, 2021

Given three integers N, A, and B, the task is to calculate the probability that the sum of numbers obtained on throwing the dice exactly N times lies between A and B.

Examples:

Input: N = 1, A = 2, B = 3
Output: 0.333333
Explanation: Ways to obtained the sum 2 by N ( = 1) throws of a dice is 1 {2}. Therefore, required probability = 1/6 = 0.33333

Input: N = 2, A = 3, B = 4
Output: 0.138889

Recursive Approach: Follow the steps below to solve the problem:

• Calculate probabilities for all the numbers between A and B and add them to get the answer.
• Call function find(N, sum) to calculate the probability for each number from a to b, where a number between a and b will be passed as sum.
• Base cases are:
• If the sum is either greater than 6 * N or less than N, then return 0 as it’s impossible to have sum greater than N * 6 or less than N.
• If N is equal to 1 and sum is in between 1 and 6, then return 1/6.
• Since at every state any number out of 1 to 6 in a single throw of dice may come, therefore recursion call should be made for the (sum up to that state – i) where 1≤ i ≤ 6.
• Return the resultant probability.

Recursion call: Below is the implementation of the above approach:

C++

 // C++ program for above approach#include using namespace std; // Function to calculate the// probability for the given// sum to be equal to sum in// N throws of dicelong double find(int N, int sum){    // Base cases    if (sum > 6 * N || sum < N)        return 0;     if (N == 1) {         if (sum >= 1 && sum <= 6)            return 1.0 / 6;        else            return 0;    }    long double s = 0;    for (int i = 1; i <= 6; i++)        s = s + find(N - 1, sum - i) / 6;     return s;} // Driver Codeint main(){    int N = 4, a = 13, b = 17;    long double probability = 0.0;     for (int sum = a; sum <= b; sum++)        probability = probability + find(N, sum);     // Print the answer    cout << fixed << setprecision(6) << probability;    return 0;}

Java

 // Java program for the above approachimport java.util.*;class GFG{ // Function to calculate the// probability for the given// sum to be equal to sum in// N throws of dicestatic double find(int N, int sum){    // Base cases    if (sum > 6 * N || sum < N)        return 0;    if (N == 1)    {        if (sum >= 1 && sum <= 6)            return 1.0 / 6;        else            return 0;    }    double s = 0;    for (int i = 1; i <= 6; i++)        s = s + find(N - 1, sum - i) / 6;    return s;}   // Driver codepublic static void main(String[] args){    int N = 4, a = 13, b = 17;    double probability = 0.0;    for (int sum = a; sum <= b; sum++)        probability = probability + find(N, sum);     // Print the answer    System.out.format("%.6f", probability);}} // This code is contributed by code_hunt.

Python3

 # Python 2 program for above approach # Function to calculate the# probability for the given# sum to be equal to sum in# N throws of dicedef find(N, sum):     # Base cases    if (sum > 6 * N or sum < N):        return 0    if (N == 1):        if (sum >= 1 and sum <= 6):            return 1.0 / 6        else:            return 0    s = 0    for i in range(1, 7):        s = s + find(N - 1, sum - i) / 6    return s # Driver Codeif __name__ == "__main__":    N = 4    a = 13    b = 17    probability = 0.0    for sum in range(a, b + 1):        probability = probability + find(N, sum)     # Print the answer    print(round(probability, 6))     # This code is contributed by chitranayal.

C#

 // C# program for the above approachusing System;class GFG{         // Function to calculate the    // probability for the given    // sum to be equal to sum in    // N throws of dice    static double find(int N, int sum)    {               // Base cases        if (sum > 6 * N || sum < N)            return 0;        if (N == 1)        {            if (sum >= 1 && sum <= 6)                return 1.0 / 6;            else                return 0;        }        double s = 0;        for (int i = 1; i <= 6; i++)            s = s + find(N - 1, sum - i) / 6;        return s;    }   // Driver code  static void Main()  {    int N = 4, a = 13, b = 17;    double probability = 0.0;    for (int sum = a; sum <= b; sum++)        probability = probability + find(N, sum);      // Print the answer    Console.WriteLine(Math.Round(probability,6));  }} // This code is contributed by divyeshrabadiya07

Javascript


Output:
0.505401

Time Complexity: O((b-a+1)6n)
Auxiliary Space: O(1)

Dynamic Programming Approach: The above recursive approach needs to be optimized by dealing with the following overlapping subproblems and optimal substructure:

Overlapping Subproblems:
Partial recursion tree for N=4 and sum=15: Optimal Substructure:
For every state, recur for other 6 states, so the recursive definition of f(N, sum) is: Top-Down Approach:

C++

 // C++ program for above approach#include using namespace std;float dp; // Function to calculate the// probability for the given// sum to be equal to sum in// N throws of dicefloat find(int N, int sum){    if (dp[N][sum])        return dp[N][sum];     // Base cases    if (sum > 6 * N || sum < N)        return 0;    if (N == 1) {        if (sum >= 1 && sum <= 6)            return 1.0 / 6;        else            return 0;    }    for (int i = 1; i <= 6; i++)        dp[N][sum] = dp[N][sum]                     + find(N - 1, sum - i) / 6;    return dp[N][sum];} // Driver Codeint main(){    int N = 4, a = 13, b = 17;    float probability = 0.0;     // Calculate probability of all    // sums from a to b    for (int sum = a; sum <= b; sum++)        probability = probability + find(N, sum);     // Print the answer    cout << fixed << setprecision(6) << probability;    return 0;}

Java

 // Java program for above approachclass GFG{    static float[][] dp = new float;     // Function to calculate the    // probability for the given    // sum to be equal to sum in    // N throws of dice    static float find(int N, int sum)    {        if (N < 0 | sum < 0)            return 0;        if (dp[N][sum] > 0)            return dp[N][sum];         // Base cases        if (sum > 6 * N || sum < N)            return 0;        if (N == 1) {            if (sum >= 1 && sum <= 6)                return (float) (1.0 / 6);            else                return 0;        }        for (int i = 1; i <= 6; i++)            dp[N][sum] = dp[N][sum] + find(N - 1, sum - i) / 6;        return dp[N][sum];    }     // Driver Code    public static void main(String[] args)    {        int N = 4, a = 13, b = 17;        float probability = 0.0f;         // Calculate probability of all        // sums from a to b        for (int sum = a; sum <= b; sum++)            probability = probability + find(N, sum);         // Print the answer        System.out.printf("%.6f", probability);    }} // This code is contributed by shikhasingrajput

Python3

 # Python program for above approachdp = [[0 for i in range(605)] for j in range(105)]; # Function to calculate the# probability for the given# sum to be equal to sum in# N throws of dicedef find(N, sum):    if (N < 0 | sum < 0):        return 0;    if (dp[N][sum] > 0):        return dp[N][sum];     # Base cases    if (sum > 6 * N or sum < N):        return 0;    if (N == 1):        if (sum >= 1 and sum <= 6):            return (float)(1.0 / 6);        else:            return 0;     for i in range(1,7):        dp[N][sum] = dp[N][sum] + find(N - 1, sum - i) / 6;    return dp[N][sum]; # Driver Codeif __name__ == '__main__':    N = 4; a = 13; b = 17;    probability = 0.0    f = 0;     # Calculate probability of all    # sums from a to b    for sum in range(a,b+1):        probability = probability + find(N, sum);     # Print the answer    print("%.6f"% probability); # This code is contributed by 29AjayKumar

C#

 // C# program for above approachusing System;using System.Collections.Generic;public class GFG{  static float[,] dp = new float[105, 605];   // Function to calculate the  // probability for the given  // sum to be equal to sum in  // N throws of dice  static float find(int N, int sum)  {    if (N < 0 | sum < 0)      return 0;    if (dp[N, sum] > 0)      return dp[N, sum];     // Base cases    if (sum > 6 * N || sum < N)      return 0;    if (N == 1) {      if (sum >= 1 && sum <= 6)        return (float) (1.0 / 6);      else        return 0;    }    for (int i = 1; i <= 6; i++)      dp[N, sum] = dp[N, sum] + find(N - 1, sum - i) / 6;    return dp[N, sum];  }   // Driver Code  public static void Main(String[] args)  {    int N = 4, a = 13, b = 17;    float probability = 0.0f;     // Calculate probability of all    // sums from a to b    for (int sum = a; sum <= b; sum++)      probability = probability + find(N, sum);     // Print the answer    Console.Write("{0:F6}", probability);  }} // This code is contributed by 29AjayKumar

Javascript


Output:
0.505401

Time Complexity: O(n*sum)
Auxiliary Space: O(n*sum)

Bottom-Up Approach:

C++

 // C++ program for above approach#include using namespace std;float dp; // Function to calculate probability// that the sum of numbers on N throws// of dice lies between A and Bfloat find(int N, int a, int b){    float probability = 0.0;     // Base case    for (int i = 1; i <= 6; i++)        dp[i] = 1.0 / 6;     for (int i = 2; i <= N; i++) {         for (int j = i; j <= 6 * i; j++) {             for (int k = 1; k <= 6; k++) {                 dp[i][j] = dp[i][j]                           + dp[i - 1][j - k] / 6;            }        }    }     // Add the probability for all    // the numbers between a and b    for (int sum = a; sum <= b; sum++)        probability = probability + dp[N][sum];     return probability;} // Driver Codeint main(){    int N = 4, a = 13, b = 17;     float probability = find(N, a, b);     // Print the answer    cout << fixed << setprecision(6) << probability;    return 0;}

Java

 // Java program for above approachimport java.util.*; class GFG{static float [][]dp = new float; // Function to calculate probability// that the sum of numbers on N throws// of dice lies between A and Bstatic float find(int N, int a, int b){    float probability = 0.0f;     // Base case    for (int i = 1; i <= 6; i++)        dp[i] = (float) (1.0 / 6);    for (int i = 2; i <= N; i++)    {        for (int j = i; j <= 6 * i; j++)        {            for (int k = 1; k <= 6 && k <= j; k++)            {                dp[i][j] = dp[i][j]                           + dp[i - 1][j - k] / 6;            }        }    }     // Add the probability for all    // the numbers between a and b    for (int sum = a; sum <= b; sum++)        probability = probability + dp[N][sum];    return probability;} // Driver Codepublic static void main(String[] args){    int N = 4, a = 13, b = 17;    float probability = find(N, a, b);     // Print the answer    System.out.printf("%.6f",probability);}} // This codeis contributed by shikhasingrajput

Python3

 # Python3 program for above approach dp = [[0 for i in range(605)] for j in range(105)] # Function to calculate probability# that the sum of numbers on N throws# of dice lies between A and Bdef find(N, a, b) :     probability = 0.0      # Base case    for i in range(1, 7) :        dp[i] = 1.0 / 6      for i in range(2, N + 1) :          for j in range(i, (6*i) + 1) :              for k in range(1, 7) :                  dp[i][j] = dp[i][j] + dp[i - 1][j - k] / 6      # Add the probability for all    # the numbers between a and b    for Sum in range(a, b + 1) :        probability = probability + dp[N][Sum]      return probability     N, a, b = 4, 13, 17 probability = find(N, a, b) # Print the answerprint('%.6f'%probability) # This code is contributed by divyesh072019.

C#

 // C# program for above approachusing System;public class GFG{static float [,]dp = new float[105, 605]; // Function to calculate probability// that the sum of numbers on N throws// of dice lies between A and Bstatic float find(int N, int a, int b){    float probability = 0.0f;     // Base case    for (int i = 1; i <= 6; i++)        dp[1, i] = (float) (1.0 / 6);    for (int i = 2; i <= N; i++)    {        for (int j = i; j <= 6 * i; j++)        {            for (int k = 1; k <= 6 && k <= j; k++)            {                dp[i, j] = dp[i, j]                           + dp[i - 1, j - k] / 6;            }        }    }     // Add the probability for all    // the numbers between a and b    for (int sum = a; sum <= b; sum++)        probability = probability + dp[N, sum];    return probability;} // Driver Codepublic static void Main(String[] args){    int N = 4, a = 13, b = 17;    float probability = find(N, a, b);     // Print the answer    Console.Write("{0:F6}",probability);}} // This code is contributed by shikhasingrajput

Javascript


Output:
0.505401

Time Complexity: O(N * sum)
Auxiliary Space: O(N * sum)

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up