We were play testing my friend Sam's board game this weekend. It features "annihilator towers" - you build up N levels of tower, and then roll N 6-sided dice to determine the damage dealt. Here's the wrinkle though: If you roll two or more ones, then the tower explodes and the damage is dealt to the home team. What are the chances of rolling two ones, for a given tower level?
We thought a little about it, but nobody was keen on sitting down and actually working it out. I wrote a little Python program that produced statistical answers. That was sufficient to practically answer the question, but what's the "real" answer?
First the Python simulation:
import sys, random def roll(n): R = [random.randint(1, 6) for i in range(n)] return len(filter(lambda x:x==1,R)) >= 2 N = 100000 dead = 0.0 for i in range(N): if roll(int(sys.argv[1])): dead += 1 print dead / N
And the results:
N Dice | Prob. of 2+ ones |
---|---|
2 | 0.02807 |
3 | 0.07452 |
4 | 0.13220 |
5 | 0.19485 |
6 | 0.26325 |
7 | 0.33054 |
8 | 0.39793 |
So, how to calculate it?
The chance of rolling exactly two ones on N dice is:
(1/6)2 × (5/6)N-2 × combin(N,2)
combin(N,2) is the number of ways of choosing two dice from N dice. The formula is:
combin(n,k) = n! / k!(n-k)!
But we're not finished yet. We need to count the possibilities where we roll more than two ones. In general, the chance of rolling exactly k ones on N dice is:
P(N,k) = (1/6)k × (5/6)N-k × combin(N,k)
So the chances of rolling two or more ones for N dice is:
N | |
Σ | P(N,k) |
k=2 |
So for 3 dice, it's P(3,2) + P(3,3). For four dice it's P(4,2) + P(4,3) + P(4,4), etc. Here's a Python program to calculate that:
from math import factorial as f def combin(N,k): return f(N)/(f(k)*f(N-k)) def P(N,k): return (1.0/6)**k * (5.0/6)**(N-k) * combin(N,k) import sys N = int(sys.argv[1]) print sum( [P(N,k) for k in range(2,N+1)] )
And the results...
N Dice | Prob. of 2+ ones |
---|---|
2 | 0.0277777777778 |
3 | 0.0740740740741 |
4 | 0.131944444444 |
5 | 0.196244855967 |
6 | 0.263224451303 |
7 | 0.330204046639 |
8 | 0.39532309766 |
That accords pretty well with the numerical results. Apparently I have managed to remember something from my A-level maths!!