Случайный элемент из итератора? - PullRequest
3 голосов
/ 25 мая 2020

У меня есть следующий код

number_list = (i for i in range(5))
permutations = (num for num in itertools.product(number_list, repeat=9))

Он генерирует итератор с именем permutations, который будет содержать все перестановки из 9 символов в number_list, если я не ошибаюсь. Это может стать довольно большим для большого number_list.

Я могу перебирать permutations с помощью next(permutations), но проблема в том, что это последовательность. Я хотел бы иметь возможность рисовать случайный элемент из любой части итератора. Если бы это был список, я бы просто набрал random.choice(), но для большого number_list у меня нет ни памяти, ни времени для этого.

Я также мог бы просто использовать next() и сохранить список из X элементов, и они рандомизировали их, но это тоже не сработает, потому что оно может стать настолько невероятно большим, что результаты будут такими похожими, что не будет На самом деле это не "случайный".

Мне было интересно, если невозможно извлечь случайный элемент из итератора, существует ли алгоритм, который позволяет мне создать итератор, который будет выводить случайный набор с next(), но когда он закончится, он пройдет через все перестановки без повторения?

Окончательная идея заключалась бы в том, чтобы иметь итератор, который выплевывал бы случайную перестановку n символов из списка i элементов, имея возможность получить как n, так и i произвольно большие чисел без ограничений памяти, убедившись, что, когда весь итератор закончит завершение (не имеет значения когда, даже если он закончил через несколько лет в теории), все возможные перестановки будут исчерпаны без повторений.

1 Ответ

0 голосов
/ 25 мая 2020

Во-первых, ваш код не генерирует перестановки, а dr aws с заменой. Во-вторых, итераторы (как следует из названия) предназначены для ИТЕРАЦИИ через некоторую коллекцию, а не для перехода к случайным местам в ней (конечно, вы можете написать свою собственную функцию __next__, которая делает все, что вы хотите - хотите ли вы вызвать получившийся объект итератор - это философский вопрос). В-третьих, создание случайных выборок с заменой - это хорошо изученный и реализованный вопрос. См. Например: https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.random.choice.html

...