Что вы подразумеваете под «максимизировать равное распределение», четко не определено.Можно было бы рассмотреть наибольшее количество пар между двумя явлениями данного значения.Я оставлю это вам, чтобы показать, как метод, который я здесь привожу, работает относительно этого.
С n объектами у нас есть n * (n-1) пар.В этих (a, b)
парах:
Мы можем сгенерировать первые n пар с разностью 1, затем n пар с разницей 2 ...
Для каждого различия мы генерируем индексы, добавляя разницу к индексу (по модулю n).Когда мы получаем a
, который уже использовался для этой разницы, мы добавляем 1 (снова по модулю n).Таким образом, мы можем сгенерировать n пар с этой разницей.Поскольку мы «катимся» по индексам, мы уверены, что каждое значение будет появляться регулярно.
def pairs(n):
for diff in range(1, n):
starts_seen = set()
index = 0
for i in range(n):
pair = [index]
starts_seen.add(index)
index = (index+diff) % n
pair.append(index)
yield pair
index = (index+diff) % n
if index in starts_seen:
index = (index+1) % n
pairs2 = list(pair for pair in pairs(2))
print(pairs2)
# [[0, 1], [1, 0]]
pairs3 = list(pair for pair in pairs(3))
print(pairs3)
# [[0, 1], [2, 0], [1, 2],
# [0, 2], [1, 0], [2, 1]]
pairs4 = list(pair for pair in pairs(4))
print(pairs4)
# [[0, 1], [2, 3], [1, 2], [3, 0], <- diff = 1
# [0, 2], [1, 3], [2, 0], [3, 1], <- diff = 2
# [0, 3], [2, 1], [1, 0], [3, 2]] <- diff = 3
pairs5 = list(pair for pair in pairs(5))
print(pairs5)
# [[0, 1], [2, 3], [4, 0], [1, 2], [3, 4],
# [0, 2], [4, 1], [3, 0], [2, 4], [1, 3],
# [0, 3], [1, 4], [2, 0], [3, 1], [4, 2],
# [0, 4], [3, 2], [1, 0], [4, 3], [2, 1]]
# A check to verify that we get the right number of different pairs:
for n in range(100):
pairs_n = set([tuple(pair) for pair in pairs(n)])
assert len(pairs_n) == n*(n-1)
print('ok')
# ok