Ошибка Python OOM при перетасовке itertools.permutation (range (15)) - PullRequest
0 голосов
/ 31 декабря 2018

из 15!возможные перестановки цифр 1-15, мне нужно выбрать 10!из них наугад.

К сожалению, хотя подход в этого ответа позволяет избежать проблемы нехватки памяти, возникающей при сохранении всех перестановок и их перестановке, если я выполняю итерацию в течение первых 10!перестановки с использованием итератора, возвращаемого itertools.permutations, все они будут в порядке.Для меня важно получить случайную выборку перестановок (без дубликатов).

from itertools import permutations
from random import shuffle
from math import factorial

count=15
placements = list(permutations(range(count), count))
shuffle(placements)
for placement in placements[:factorial(10)]:
    // do something with placement

Я попробовал следующее, но нет никакой гарантии, что он не выберет одну и ту же перестановку дважды:

from math import factorial
from random import sample

count=15
for notused in range(factorial(10)):
    placement = sample(range(count),count)
    \\ do something with placement

В настоящее время пробует следующий подход, основанный на этот ответ :

from math import factorial
from random import sample

placements = set()
count = 15
cap = factorial(10)
while len(placements) < cap:
    placements.add(tuple(sample(range(count),count)))
for placement in placements:
    \\ do something with placement

1 Ответ

0 голосов
/ 31 декабря 2018

Если я не ошибаюсь, перестановки в вашем случае в основном перетасовывают список таким образом, чтобы ни одно число не повторялось, возможно, вы можете сделать:

from random import shuffle
samps = []
count = 0
while count < 10:

    j = list(range(15))
    shuffle(j)
    if j not in samps:
        samps.append(j)
    count += 1

Это дает:

[[0, 11, 13, 14, 1, 9, 6, 4, 5, 3, 7, 10, 2, 12, 8],
 [10, 1, 9, 2, 4, 0, 13, 14, 5, 8, 12, 7, 11, 3, 6],
 [3, 13, 6, 4, 12, 5, 0, 2, 10, 7, 1, 8, 11, 9, 14],
 [1, 10, 13, 7, 11, 9, 8, 4, 14, 0, 12, 2, 3, 6, 5],
 [9, 8, 7, 11, 3, 10, 6, 5, 4, 0, 14, 12, 1, 13, 2],
 [3, 11, 6, 8, 1, 4, 12, 14, 7, 5, 13, 0, 10, 9, 2],
 [5, 13, 8, 3, 0, 9, 1, 4, 11, 12, 6, 14, 2, 10, 7],
 [11, 1, 0, 2, 13, 12, 14, 3, 6, 10, 9, 7, 4, 8, 5],
 [12, 10, 6, 7, 2, 13, 3, 0, 1, 8, 4, 11, 14, 5, 9],
 [2, 5, 7, 9, 4, 12, 14, 6, 3, 10, 8, 13, 11, 0, 1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...