Berger explained

Otto Milvang, Rev 2, September 17, 2026

Introduction

The Berger tables are a predefined pairing system used for round-robin tournaments. They are described in FIDE Handbook C.05, Annex 1: Details of Berger Table. This article shows an efficient way to use Berger tables in round-robin tournaments and explains how to calculate them. The document covers only Berger tables for an even number of players. When there are an odd number of players, the highest number is treated as a bye.

Berger tables 10 players

Rd 1:   1 - 10  2 - 9  3 - 8  4 - 7  5 – 6
Rd 2:   10 - 6  7 - 5  8 - 4  9 - 3  1 – 2
Rd 3:   2 - 10  3 - 1  4 - 9  5 - 8  6 – 7
Rd 4:   10 - 7  8 - 6  9 - 5  1 - 4  2 – 3
Rd 5:   3 - 10  4 - 2  5 - 1  6 - 9  7 – 8
Rd 6:   10 - 8  9 - 7  1 - 6  2 - 5  3 – 4
Rd 7:   4 - 10  5 - 3  6 - 2  7 - 1  8 – 9
Rd 8:   10 - 9  1 - 8  2 - 7  3 - 6  4 – 5
Rd 9:   5 - 10  6 - 4  7 - 3  8 - 2  9 - 1

How to run a Round Robin tournament based on Berger tables


The players sit at random or according to a drawing of lots. The boards are arranged with alternating colors, as shown in the figure, with the board closest to the arbiter always having Black on the arbiter’s left. The player seated at this board has the highest starting number, remains in the same place throughout the tournament, and is therefore called the fixed player.

Counterclockwise from the arbiter, the players are numbered in the order in which they meet the player with the highest starting number. Another approach is to place the players counterclockwise by seating the white players first, from 1 to N/2, followed by the black players, from N/2 + 1 to N.

When the first round is finished, all players move one step clockwise around the table, skipping over the fixed player. The fixed player turns the board after each round so that they alternate between black and white games. The tournament continues in this way until everyone has played everyone else.

If there is an odd number of players, the board next to the arbiter can be removed. In that case, remember that player 1 has a bye in round 1.

This scheme will follow the Berger tables. The board numbers follow the white players start number from round 1.

Result tables

 

There are two main types of result tables for Berger tournaments: the cross table and the Berger result table.

The cross table is easy to understand, but it does not show which round a game was played in or which colors the players had.

The Berger result table has one column per round and also shows the colors. For example, if player 3 has the number 5 in the left corner in round 7, player 5 has White against player 3, written as 5-3.

 

Create your own Berger tables at: https://www.milvang.no/spp/berger/berger.html

Properties of the Berger tables

For an odd number of players, the Berger table gives each player a perfect color alternation. In each round, the opponent’s starting number increases by 1 using cyclic arithmetic, where 1 follows P and P is the number of players. A player cannot play against themselves, so that round is recorded as a bye. For an odd P, the tournament therefore needs P rounds for every player to meet every other player.

The following tables illustrate these properties. Each row shows one player’s sequence of opponents and colors across the rounds. The dash marks the round in which the player has a bye.

   1  2  3  4  5  6  7
========================
1: -- 2w 3b 4w 5b 6w 7b
2: 7w 1b -- 3w 4b 5w 6b
3: 6w 7b 1w 2b -- 4w 5b
4: 5w 6b 7w 1b 2w 3b --
5: 4b -- 6w 7b 1w 2b 3w
6: 3b 4w 5b -- 7w 1b 2w
7: 2b 3w 4b 5w 6b -- 1w

 

With an even number of players, the added last player meets the player who would otherwise have had a bye, alternating color from round to round. For an even P, the tournament needs P - 1 rounds for every player to meet every other player.

   1  2  3  4  5  6  7
========================
1: 8w 2w 3b 4w 5b 6w 7b
2: 7w 1b 8w 3w 4b 5w 6b
3: 6w 7b 1w 2b 8w 4w 5b
4: 5w 6b 7w 1b 2w 3b 8w
5: 4b 8b 6w 7b 1w 2b 3w
6: 3b 4w 5b 8b 7w 1b 2w
7: 2b 3w 4b 5w 6b 8b 1w
8: 1b 5w 2b 6w 3b 7w 4b

Note that no player has the same color in the last two rounds. It is impossible, however, to prevent every player from having the same color twice in a row at some point. For players 1 to P - 1, the opponent’s starting number increases by 1 using cyclic arithmetic, where 1 follows P - 1 and P is the number of players. Instead of meeting themselves, these players meet player P. Player P has Black in round 1 and then alternates color in each following round.

The properties described above are valid for any number of players.

 


 

Double Berger

If the Berger table is simply played twice, with colors reversed in the second cycle, some players may receive the same color in three consecutive games.

The FIDE Handbook gives the following recommendation: “For a double-round tournament it is recommended to reverse the order of the last two rounds of the first cycle. This is to avoid three consecutive games with the same colour.”

However, this recommendation disrupts the regular structure of the Berger tables. For example, when P is even, almost all players will have the same color in rounds P - 3 and P - 2. The same problem also occurs when P is odd: almost all players will have the same color in rounds P - 2 and P - 1.

My recommendation is to use the Berger table for N players twice. In the first cycle, start with the last round of the Berger table, then play the remaining rounds in the order 1, 2, … . In the second cycle, play the rounds in the normal order with colors reversed.

Analysis, 7 players

   7  1  2  3  4  5  6  1  2  3  4  5  6  7 
=============================================
1: 7b -- 2w 3b 4w 5b 6w -- 2b 3w 4b 5w 6b 7w
2: 6b 7w 1b -- 3w 4b 5w 7b 1w -- 3b 4w 5b 6w
3: 5b 6w 7b 1w 2b -- 4w 6b 7w 1b 2w -- 4b 5w
4: -- 5w 6b 7w 1b 2w 3b 5b 6w 7b 1w 2b 3w --
5: 3w 4b -- 6w 7b 1w 2b 4w -- 6b 7w 1b 2w 3b
6: 2w 3b 4w 5b -- 7w 1b 3w 4b 5w -- 7b 1w 2b
7: 1w 2b 3w 4b 5w 6b -- 2w 3b 4w 5b 6w -- 1b

No player has the same color twice in a row. The increase in the opponents’ starting numbers is preserved, with a double step from the first cycle to the second.

Analysis, 8 players

   7  1  2  3  4  5  6  1  2  3  4  5  6  7 
=============================================
1: 7b 8w 2w 3b 4w 5b 6w 8b 2b 3w 4b 5w 6b 7w
2: 6b 7w 1b 8w 3w 4b 5w 7b 1w 8b 3b 4w 5b 6w
4: 5b 6w 7b 1w 2b 8w 4w 6b 7w 1b 2w 8b 4b 5w
4: 8w 5w 6b 7w 1b 2w 3b 5b 6w 7b 1w 2b 3w 8b
5: 3w 4b 8b 6w 7b 1w 2b 4w 8w 6b 7w 1b 2w 3b
6: 2w 3b 4w 5b 8b 7w 1b 3w 4b 5w 8w 7b 1w 2b
7: 1w 2b 3w 4b 5w 6b 8b 2w 3b 4w 5b 6w 8w 1b
8: 4b 1b 5w 2b 6w 3b 7w 1w 5b 2w 6b 3w 7b 4w

Each player has one pair of consecutive White games and one pair of consecutive Black games.

The advantage of this method is that it improves color balance without losing the regular structure of the Berger table. By starting the first cycle with the last Berger round and then continuing with the remaining rounds in normal order, the sequence of opponents remains systematic and easy to calculate. At the same time, the method, for an odd number of players no player receives the same color twice in a row, and for an even number of players each player has only one pair of consecutive White games and one pair of consecutive Black games.

How to build the Berger tables

Let N be the number of players, or the number of players plus 1 if the number of players is odd. The players are assigned pairing numbers from 1 to N. The number of boards is B = N/2. In the first round, the lower half has White and the upper half has Black. In general, on board b, where b is in the range 1 ... B, player m has White against player N - m + 1.

Example 10 players:
Rd 1:   1 - 10  2 - 9  3 - 8  4 - 7  5 – 6

All following rounds are built from the previous round using this algorithm:

Step 1: Sort players 1 ... N - 1 according to their pairing numbers in the previous round, placing White before Black. On the first board, player N meets the last player in the sorted list. Remove that player from the list and pair them with player N. Player N alternates color from round to round. The other player is White if their pairing number is in the range 1 ... B, and Black otherwise.

Example 10 players:
Rd 1:   1 - 10  2 - 9  3 - 8  4 - 7  5 – 6
List:   1 2 9 3 8 4 7 5 6
Board 1:   10 – 6
Remaining:   1 2 9 3 8 4 7 5

Step 2: Starting from the end of the list, make a pair with the penultimate player as White and the last player as Black, then remove both players from the list. Repeat this process until the list is empty.

Example 10 players:
Remaining:   1 2 9 3 8 4 7 5
Board 1-2:   10 - 6  7 - 5 
Remaining:   1 2 9 3 8 4
Board 1-3:   10 - 6  7 - 5  8 - 4
Remaining:   1 2 9 3
Board 1-4:   10 - 6  7 - 5  8 - 4  9 - 3
Remaining:   1 2
Board 1-5:   10 - 6  7 - 5  8 - 4  9 - 3  1 – 2

Repeat from step 1 until all rounds are paired.

After 9 rounds, the complete pairing is:

Rd 1:   1 - 10  2 - 9  3 - 8  4 - 7  5 – 6
Rd 2:   10 - 6  7 - 5  8 - 4  9 - 3  1 – 2
Rd 3:   2 - 10  3 - 1  4 - 9  5 - 8  6 – 7
Rd 4:   10 - 7  8 - 6  9 - 5  1 - 4  2 – 3
Rd 5:   3 - 10  4 - 2  5 - 1  6 - 9  7 – 8
Rd 6:   10 - 8  9 - 7  1 - 6  2 - 5  3 – 4
Rd 7:   4 - 10  5 - 3  6 - 2  7 - 1  8 – 9
Rd 8:   10 - 9  1 - 8  2 - 7  3 - 6  4 – 5
Rd 9:   5 - 10 
6 - 4  7 - 3  8 - 2  9 – 1

 

 

Code in python

 

"""

Created on Sun Nov 12 15:50:51 2023
@author: Otto Milvang, sjakk@milvang.no

bergertables is the core of the round-robin pairing system. See the FIDE Handbook: C. General Rules and Technical Recommendations for Tournaments; 05. General Regulations for Competitions; Annex 1: Details of Berger Table.

n is he number of players, odd numbers are lifted to the first even number
returns a 3-level dict
  1-dim - 1 .. n-1 is [round_number]
  2-dim - 1 .. n/2 is [pair_number]
  3-dim - {'white', 'black'} - players numbered 1 .. n
rr = bergertables(n)
In round 6, board 2:
 white = rr['parining'][6][2]['white']
 black = rr['parining'][6][2]['black']
"""

def bergertablesGeneric(nplayers):
    nplayers = nplayers  + (nplayers % 2)
    pairs = nplayers//2
    bergertable = { 'players': nplayers, 'parining': {} }
    pairing =  {}
    for board in range(1, pairs + 1):
        pairing[board] = {'white': board, 'black': nplayers - board + 1}
    bergertable['parining'][1] = pairing
    nplayeriswhite = False
    for rnd in range(2, nplayers):
        playerlist = []
        for board in range(1, pairs+1):
            for color in ['white', 'black']:
                if pairing[board][color] < nplayers:
                    playerlist.append(pairing[board][color])
        pairing = {}
        firstboard = playerlist.pop()
        if nplayeriswhite:
            pairing[1] = {'white': firstboard, 'black': nplayers}
        else:
            pairing[1] = {'white': nplayers, 'black': firstboard}
        nplayeriswhite = not nplayeriswhite
       

        for board in range(2, pairs+1):
            black = playerlist.pop()
            white = playerlist.pop()
            pairing[board] = {'white': white, 'black': black}
        bergertable['parining'][rnd] = pairing
    return bergertable


See:
https://github.com/OttoMilvang/TieBreakServer/blob/main/berger.py

 

 

Berger tables

 

3 or 4 players:
Rd 1: 1-4, 2-3.
Rd 2: 4-3, 1-2.
Rd 3: 2-4, 3-1.

5 or 6 players:
Rd 1: 1-6, 2-5, 3-4.
Rd 2: 6-4, 5-3, 1-2.
Rd 3: 2-6, 3-1, 4-5.
Rd 4: 6-5, 1-4, 2-3.
Rd 5: 3-6, 4-2, 5-1.

7 or 8 players:
Rd 1: 1-8, 2-7, 3-6, 4-5.
Rd 2: 8-5, 6-4, 7-3, 1-2.
Rd 3: 2-8, 3-1, 4-7, 5-6.
Rd 4: 8-6, 7-5, 1-4, 2-3.
Rd 5: 3-8, 4-2, 5-1, 6-7.
Rd 6: 8-7, 1-6, 2-5, 3-4.
Rd 7: 4-8, 5-3, 6-2, 7-1.

9 or 10 players:
Rd 1: 1-10, 2-9, 3-8, 4-7, 5-6.
Rd 2: 10-6, 7-5, 8-4, 9-3, 1-2.
Rd 3: 2-10, 3-1, 4-9, 5-8, 6-7.
Rd 4: 10-7, 8-6, 9-5, 1-4, 2-3.
Rd 5: 3-10, 4-2, 5-1, 6-9, 7-8.
Rd 6: 10-8, 9-7, 1-6, 2-5, 3-4.
Rd 7: 4-10, 5-3, 6-2, 7-1, 8-9.
Rd 8: 10-9, 1-8, 2-7, 3-6, 4-5.
Rd 9: 5-10, 6-4, 7-3, 8-2, 9-1.

11 or 12 players:
Rd 1: 1-12, 2-11, 3-10, 4-9, 5-8, 6-7.
Rd 2: 12-7, 8-6, 9-5, 10-4, 11-3, 1-2.
Rd 3: 2-12, 3-1, 4-11, 5-10, 6-9, 7-8.
Rd 4: 12-8, 9-7, 10-6, 11-5, 1-4, 2-3.
Rd 5: 3-12, 4-2, 5-1, 6-11, 7-10, 8-9.
Rd 6: 12-9, 10-8, 11-7, 1-6, 2-5, 3-4.
Rd 7: 4-12, 5-3, 6-2, 7-1, 8-11, 9-10.
Rd 8: 12-10, 11-9, 1-8, 2-7, 3-6, 4-5.
Rd 9: 5-12, 6-4, 7-3, 8-2, 9-1, 10-11.
Rd 10: 12-11, 1-10, 2-9, 3-8, 4-7, 5-6.
Rd 11: 6-12, 7-5, 8-4, 9-3, 10-2, 11-1.

 

13 or 14 players:
Rd 1: 1-14, 2-13, 3-12, 4-11, 5-10, 6-9, 7-8.
Rd 2: 14-8, 9-7, 10-6, 11-5, 12-4, 13-3, 1-2.
Rd 3: 2-14, 3-1, 4-13, 5-12, 6-11, 7-10, 8-9.
Rd 4: 14-9, 10-8, 11-7, 12-6, 13-5, 1-4, 2-3.
Rd 5: 3-14, 4-2, 5-1, 6-13, 7-12, 8-11, 9-10.
Rd 6: 14-10, 11-9, 12-8, 13-7, 1-6, 2-5, 3-4.
Rd 7: 4-14, 5-3, 6-2, 7-1, 8-13, 9-12, 10-11.
Rd 8: 14-11, 12-10, 13-9, 1-8, 2-7, 3-6, 4-5.
Rd 9: 5-14, 6-4, 7-3, 8-2, 9-1, 10-13, 11-12.
Rd 10: 14-12, 13-11, 1-10, 2-9. 3-8, 4-7, 5-6.
Rd 11: 6-14, 7-5, 8-4, 9-3, 10-2, 11-1, 12-13.
Rd 12: 14-13, 1-12, 2-11, 3-10, 4-9, 5-8, 6-7.
Rd 13: 7-14, 8-6, 9-5, 10-4, 11-3, 12-2, 13-1.

15 or 16 players:
Rd 1: 1-16, 2-15, 3-14, 4-13, 5-12, 6-11, 7-10, 8-9.
Rd 2: 16-9, 10-8, 11-7, 12-6, 13-5, 14-4, 15-3, 1-2.
Rd 3: 2-16, 3-1, 4-15, 5-14, 6-13, 7-12, 8-11, 9-10.
Rd 4: 16-10, 11-9, 12-8, 13-7, 14-6, 15-5, 1-4, 2-3.
Rd 5: 3-16, 4-2, 5-1, 6-15, 7-14, 8-13, 9-12, 10-11.
Rd 6: 16-11, 12-10, 13-9, 14-8, 15-7, 1-6, 2-5, 3-4.
Rd 7: 4-16, 5-3, 6-2, 7-1, 8-15, 9-14, 10-13, 11-12.
Rd 8: 16-12, 13-11, 14-10, 15-9, 1-8, 2-7, 3-6, 4-5.
Rd 9: 5-16, 6-4, 7-3, 8-2, 9-1, 10-15, 11-14, 12-13.
Rd 10: 16-13, 14-12, 15-11, 1-10, 2-9, 3-8, 4-7, 5-6.
Rd 11: 6-16, 7-5, 8-4, 9-3, 10-2, 11-1, 12-15, 13-14.
Rd 12: 16-14, 15-13, 1-12, 2-11, 3-10, 4-9, 5-8, 6-7.
Rd 13: 7-16, 8-6, 9-5, 10-4, 11-3, 12-2, 13-1, 14-15.
Rd 14: 16-15, 1-14, 2-13, 3-12, 4-11, 5-10, 6-9, 7-8.
Rd 15: 8-16, 9-7, 10-6, 11-5, 12-4, 13-3, 14-2, 15-1.