Как заставить этот код работать лучше (список комбинаций)? - PullRequest
0 голосов
/ 02 июня 2018
import random

def ordenar(inputx):
    inputx = list(inputx)
    inputx = sorted(inputx, key=int)
    return inputx

def get_numbers(totall):
    return random.sample(numeros, totall)

numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]

all_jogos = []
maximo_repetido = 9

vezes = 0

while True:
    numbers = get_numbers(15)
    for i in all_jogos:
        total_repetido = len(set(numbers).intersection(i))
        if total_repetido <= maximo_repetido:
            vezes += 1
        else:
            vezes = 0
            break
    if vezes >= len(all_jogos):
        all_jogos.append(numbers)
        print("%s," % ordenar(numbers))

По сути, я намерен создать списки из 15 чисел, чтобы между ними повторялось не более 9 чисел (переменная maximo_repetido), создавая как можно больше списков.Сравнение выполняется со всеми списками, содержащимися в all_jogos, который увеличивается с каждым циклом, пока принимается условие.

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

Как выполнить условие / проверку / сравнение, когда вы собираетесь сгенерировать числа, заставляя искать только возможные результаты?

1 Ответ

0 голосов
/ 02 июня 2018

itertools.combinations(iterable, n) дает вам все комбинации n длины в iterable.Это то, что вы хотите использовать здесь.

import itertools

numbers = range(1, 26)

combos = itertools.combinations(numbers, 15)

combos теперь является итератором ( не список, обратите внимание, поэтому, если вам нужно прочитать его несколько раз, вам нужнодля явного приведения) всех комбинаций из 15-значных чисел 1-25, и вы можете использовать A * или какой-либо другой алгоритм поиска пути, чтобы найти наилучшее возможное решение.

...