Изменение основы матриц - PullRequest
0 голосов
/ 03 августа 2020

Я попытался преобразовать комбинацию из 5 элементов с 50 числами list(itertools.combinations(range(1, 51), 5)) в две координаты [x, y]. Моя цель - поместить все вероятности в сетку, а затем рандомизировать некоторую комбинацию, чтобы поместить их в ее координаты.

Я думаю, мне нужно сделать это, используя изменение базиса матриц с matrix(a, b, c, d, e) на matrix(x, y), но я не достиг своей цели.

Комбинации возвращают что-то вроде:

1, 2, 3, 4, 5 
1, 2, 3, 4, 6
...
1, 2, 3, 4, 50
...
1, 2, 3, 5, 7
...
44, 46, 47, 48, 49
...
46, 47, 48, 49, 50

Итак, я хочу получить уникальный идентификатор для каждой комбинации, а затем преобразовать это число в координаты в двумерной матрице.

Я думаю, что это самый простой способ.

Потому что моя цель все та же: представить все 2118750 комбинаций на экране, а затем вставить несколько случайных комбинаций, чтобы увидеть, как они занимают всю печатаемую поверхность.

Другими словами: сделать что-то вроде этой страницы: http://lotterycodex.com/visual-analysis

1 Ответ

1 голос
/ 03 августа 2020

Быстрый и грязный подход:

import itertools

index = {c:i for i,c in enumerate(itertools.combinations(range(1,51),5))}

def f(c):
    return divmod(index[c],1456) #1456 = the ceiling of the square root of 2118750

Например,

>>> f((10,20,30,40,50))
(983, 913)

Можно вычислить индекс комбинации напрямую, разработав функцию ранжирования для комбинаций , но инициализация словаря занимает всего секунду или около того, так зачем беспокоиться?

...