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:





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!!