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. :)
Add up the array of frequency of previous rolls, 'side number' times by shifting it's position, then you will get the array of frequencies each numbers show up.
This is much faster than brute force simulation, since simple equation is the best. Here is my python3 implementation.
for example,
Note that, you should use 'target number - roll count' as index of the list to get frequency of each number. If you want to get probabilities, use 'side number'^'roll count' as a denominator.
This code yeilds
There are 6*6 = 36 combinations for two dice.
2 = 1+1 can only appear once, so its frequency is 1/36. 3 = 1+2 or 2+1, so its frequency is 2/36 = 1/18. 4 = 1+3, 2+2, or 3+1, so its frequency is 3/36 = 1/12.
You can do the rest out to twelve.
Any backgammon player knows these well.
After a lot of searching on the Internet and stackoverflow, I found Dr. Math explains it well in a working function (a link in another answer has an incorrect formula). I converted Dr. Math's formula to C# and my nUnit tests (which had been failing before with other attempts at the code) all passed.
First I had to write a few helper functions:
Because of the way choose works in mathematics, I realized I could cut down on the calculations if I had an overloaded Factorial function with a lower bound. This function can bail out when the lower bound is reached.
When those were in place, I was able to write
Rough draft of a recursive way to do it:
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
Neat factoid...
Did you know that Pascal's triangle is the probability distribution of the sums of N 2-sided dice?
JavaScript implementation using dynamic function creation:
EDIT: Rather disappointed nobody pointed this out; had to replace
6 * dice
withMath.pow(6, dice)
. No more mistakes like that...