Home » Uncategorized » The number of possible bingo cards

The number of possible bingo cards

During a recent holiday I was sitting through the bingo session that some younger relatives were playing.  My mind wandered onto the question of how many possible cards exist.

A bingo card (as played in the UK, maybe elsewhere too?) has 27 boxes arranged as 3 rows by 9 columns.  Each row has 5 numbers and 4 blanks.  No column may be all blank.  The first column contains numbers between 1-9, the second contains numbers between 10-19, and so on.  The last 2 columns contain numbers between 70-79 and 80-90 respectively.  Note the uneven distribution of possible numbers in the columns.  Numbers are in increasing order downwards if more than one appears in a column.  I don’t believe it’s a requirement for there to be (or not to be) a column with 3 numbers in, but both cases are computed below for completeness.

So moving straight to the answer: 3,669,688,706,217,187,500

If exactly one column must have 3 numbers: 1,957,437,874,940,625,000

If at least one column must have 3 numbers: 2,494,937,545,340,625,000

The numbers were computed with the Python script below:

#!/usr/bin/python3

# Look up table of how many ways there are to fill the nth column with numbers
# from the appropriate range, based on how many non-blank v blank entries there
# are
perms_per_col =      [( 9,  9* 8//2,  9* 8*7//6)] # 1-9, 9 numbers
perms_per_col += 7 * [(10, 10* 9//2, 10* 9*8//6)] # 2nd-8th cols, 10 numbers
perms_per_col +=     [(11, 11*10//2, 11*10*9//6)] # 80-90, 11 numbers

# Build list of 4-tuples containing the possible indices (0...8) of 4 blanks
# within a row of 9 cells
patterns = []
for x0 in range(0,9):
    for x1 in range(x0+1,9):
        for x2 in range(x1+1,9):
            for x3 in range(x2+1,9):
                patterns += [(x0, x1, x2, x3)]

total = 0
total_one_three = 0
total_any_threes = 0

# 3 nested loops, over the 3 rows in the card
for i0, p0 in enumerate(patterns):
    # 'comfort' message to show progress
    print ("%d" % (i0,))
    for p1 in patterns:
        for p2 in patterns:
            # How many blank boxes there are in each column?
            blanks = [0] * 9
            for i in p0: blanks[i] += 1
            for i in p1: blanks[i] += 1
            for i in p2: blanks[i] += 1
            threes = 0 # Number of columns with 3 non-blank cells
            cards_with_this_layout = 1
            for col in range(0,9):
                # No column is allowed to have 3 blanks.  If one does, bail out of this pattern
                if blanks[col] == 3:
                    cards_with_this_layout = 0
                    break
                if blanks[col] == 0:
                    threes += 1
                table_index = 2 - blanks[col]
                cards_with_this_layout *= perms_per_col[col][table_index]
            total += cards_with_this_layout
            if threes == 1:
                total_one_three += cards_with_this_layout
            if threes > 0:
                total_any_threes += cards_with_this_layout

print ("There are {:,d} cards possible".format(total))
print ("There are {:,d} cards possible with exactly one column having three numbers".format(total_one_three))
print ("There are {:,d} cards possible with at least one column having three numbers".format(total_any_threes))

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: