algorithmprobabilitydice

Determine Frequency of numbers showing up in dice rolls


For a game I'm trying to determine the frequency that a certain # will show up at a given # of dice being rolled. I know... that question seems odd. Let me try to explain it with real numbers.

So, for 1 die, the frequency for each number will be identical. 1-6 will show up equal number of times.

Now for 2 dice, things get different. I imagine 5,6,7 are going to be the most frequently rolled, while numbers at both ends of the spectrum will show up less or not at all (in the case of 1). I'd like to know how to calculate this list and show them in the proper order, from most frequent to less frequent.

Any thoughts?


@duffymo - It would be really nice though to have some sort of an algorithm to come up with it. It seems that the above way is going to require a lot of hand picking and placing of numbers. If my die count is dynamic up to say 10, doing that by hand will be ineffecient and troublesome I think. :)


Solution

  • Rough draft of a recursive way to do it:

    public static IEnumerable<KeyValuePair<int, int>> GetFrequenciesByOutcome(int nDice, int nSides)
    {
        int maxOutcome = (nDice * nSides);
        Dictionary<int, int> outcomeCounts = new Dictionary<int, int>();
        for(int i = 0; i <= maxOutcome; i++)
            outcomeCounts[i] = 0;
    
        foreach(int possibleOutcome in GetAllOutcomes(0, nDice, nSides))
            outcomeCounts[possibleOutcome] = outcomeCounts[possibleOutcome] + 1;
    
        return outcomeCounts.Where(kvp => kvp.Value > 0);
    }
    
    private static IEnumerable<int> GetAllOutcomes(int currentTotal, int nDice, int nSides)
    {
        if (nDice == 0) yield return currentTotal;
        else
        {
            for (int i = 1; i <= nSides; i++)
                foreach(int outcome in GetAllOutcomes(currentTotal + i, nDice - 1, nSides))
                    yield return outcome;
        }
    }
    

    Unless I'm mistaken, this should spit out KeyValuePairs organized like [key, frequency].

    EDIT: FYI, after running this, it shows the frequencies for GetFrequenciesByOutcome(2, 6) to be:

    2: 1

    3: 2

    4: 3

    5: 4

    6: 5

    7: 6

    8: 5

    9: 4

    10: 3

    11: 2

    12: 1