у меня есть множество 27 элементов, и я не хочу производить все перестановки множества (27!) мне нужно 5000 случайным образом choosed перестановки, любой наконечник будет полезен...
Для генерации одной перестановки используйте random.shuffle
и сохраните копию результата. Повторите эту операцию в цикле и каждый раз проверяйте наличие дубликатов (их, вероятно, не будет). Как только в вашем результирующем наборе будет 5000 элементов, остановитесь.
Для адресации пункта в комментарии случайный модуль Python's основан на Mersenne Twister и имеет период 2**19937-1
, который значительно больше, чем 27!
, поэтому он должен быть пригоден для вашего использования.
itertools.permutations
. Это генератор, поэтому он не создаст весь список перестановок. Вы можете пропустить случайным образом, пока у вас не будет 5000.
import random
perm_list = []
for i in range(5000):
temp = range(27)
random.shuffle(temp)
perm_list.append(temp)
print(perm_list)
10888869450418352160768000000
Я люблю большие цифры!:)
И
10888869450418352160768000001
ПРАЙМ!!
EDIT:
#with duplicates check as suggested in the comment
perm_list = set()
while len(perm_list)<5000:
temp = range(27)
random.shuffle(temp)
perm_list.add(tuple(temp)) # `tuple` because `list`s are not hashable. right Beni?
print perm_list
ВНИМАНИЕ: Это никогда не прекратится, если RNG плохой!
itertools.permutations
. Это генератор, поэтому он не создаст весь список перестановок. Вы можете пропустить случайным образом, пока у вас не будет 5000.
Может потребоваться функция itertools.permutations (). Должен любить этот модуль итертулов!
ПРИМЕЧАНИЕ: Новое в 2,6
itertools.permutations
. Это генератор, поэтому он не будет создавать весь список перестановок. Вы можете пропустить случайным образом, пока не получите 5000.
# apermindex should be a number between 0 and factorial(len(alist))
def perm_given_index(alist, apermindex):
for i in range(len(alist)-1):
apermindex, j = divmod(apermindex, len(alist)-i)
alist[i], alist[i+j] = alist[i+j], alist[i]
return alist
Использование: perm_given_index(['a','b','c'], 3)
Здесь используется код Лемера для перестановки, так как значения j
соответствуют этому.