Других методов я просто не вижу. Искать «round-robin tournament algorithm». Но, по-моему, проще поворачивать не кольцо, а схему матчей, поставив одну из команд (лучше последнюю) в центр круга.
https://commons.wikimedia.org/wiki/File:Round-robi...
Матчам 2-13, 3-12 и т.д. даём фиксированные направления, причём попеременно: 2-13, 12-3, 11-4…
Направление матча 1-14 постоянно меняется.
Если команды нумеруются от 0 до N−1, N — чётное, алгоритм получается такой.
trans := случайная перестановка чисел 0 … N−1
если N чётное
то M := N−1
иначе M := N
цикл 2half = false…true
цикл round = 0…M−1
цикл shift = 1…[M/2]
home := (round + shift) % M
away := (round + M − shift) % M
если (shift нечётное) xor 2half
обменять home, away
вывести trans[home], trans[away]
если N чётное
home := round
away := M
если (round нечётное) xor 2half
обменять home, away
вывести trans[home], trans[away]
Для чётного N одна команда постоянно меняет поле, у остальных — единожды на круге сбивается. Для нечётного N ничего не сбивается.