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

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.33333Input: 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.
- Base cases are:
Recursion call:
Below is the implementation of the above approach:
C++
// C++ program for above approach#include <bits/stdc++.h>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 approach import 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 approach using 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
<script>Â
    // Javascript program for the above approach         // Function to calculate the    // probability for the given    // sum to be equal to sum in    // N throws of dice    function find(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;        }        let s = 0;        for (let i = 1; i <= 6; i++)            s = s + find(N - 1, sum - i) / 6;        return s;    }         let N = 4, a = 13, b = 17;    let probability = 0.0;    for (let sum = a; sum <= b; sum++)        probability = probability + find(N, sum);       // Print the answer    document.write(probability.toFixed(6));   </script> |
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 <bits/stdc++.h>using namespace std;float dp[105][605];Â
// 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[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        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
<script>Â
// Javascript program for above approachÂ
var dp = Array(105).fill().map(()=>Array(605).fill(0.0));Â
// Function to calculate the// probability for the given// sum to be equal to sum in// N throws of dicefunction 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 || sum < N)        return 0;    if (N == 1)    {        if (sum >= 1 && sum <= 6)            return (1.0 / 6);        else            return 0;    }         for(var i = 1; i <= 6; i++)        dp[N][sum] = dp[N][sum] +            find(N - 1, sum - i) / 6;                return dp[N][sum];}Â
// Driver Codevar N = 4, a = 13, b = 17;var probability = 0.0;Â
// Calculate probability of all// sums from a to bfor(sum = a; sum <= b; sum++)Â Â Â Â probability = probability + find(N, sum);Â
// Print the answerdocument.write(probability.toFixed(6));Â
// This code is contributed by umadevi9616Â
</script> |
0.505401
Â
Time Complexity: O(n*sum)
Auxiliary Space: O(n*sum)
Bottom-Up Approach:
C++
// C++ program for above approach#include <bits/stdc++.h>using namespace std;float dp[105][605];Â
// 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[1][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[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    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[1][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
<script>Â
// Javascript program of the above approachlet dp = new Array(105);Â
// Loop to create 2D array using 1D arrayfor(var i = 0; i < dp.length; i++) {Â Â Â Â dp[i] = new Array(2);}Â
for(var i = 0; i < dp.length; i++){    for(var j = 0; j < dp.length; j++)     {        dp[i][j] = 0;    }}  // Function to calculate probability// that the sum of numbers on N throws// of dice lies between A and Bfunction find(N, a, b){    let probability = 0.0;      // Base case    for(let i = 1; i <= 6; i++)        dp[1][i] = (1.0 / 6);             for(let i = 2; i <= N; i++)    {        for(let j = i; j <= 6 * i; j++)        {            for(let 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(let sum = a; sum <= b; sum++)        probability = probability + dp[N][sum];             return probability;}Â
// Driver Codelet N = 4, a = 13, b = 17;let probability = find(N, a, b);Â
// Print the answerdocument.write(probability);Â
// This code is contributed by chinmoy1997palÂ
</script> |
0.505401
Â
Time Complexity: O(N * sum)
Auxiliary Space: O(N * sum)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!




