我有以下代码
number_list = (i for i in range(5))
permutations = (num for num in itertools.product(number_list, repeat=9))
这将生成一个名为 permutations
的迭代器,如果我没记错的话,它将保存 number_list
中 9 个字符的所有排列。对于很大的 number_list
,这可能会变得相当大。
我可以使用 next(permutations)
遍历 permutations
但问题是它是顺序的。我希望能够从迭代器的任何部分抽取一个随机项。如果它是一个列表,我可以简单地执行 random.choice()
但是对于一个大的 number_list
我没有足够的内存和时间来做那个。
我也可以只使用 next()
并存储 X 数量的项目列表,然后将它们随机化,但这也行不通,因为它可能变得如此之大以至于输出将是如此相似,它不会真的是“随机的”。
我想知道,如果无法从迭代器中抽取随机项,是否有一种算法允许我创建一个迭代器,该迭代器将使用 next()
输出随机集但是当它结束时它会经历整个排列而不重复?
最终的想法是有一个迭代器,它会从 i
元素列表中吐出 n
字符的随机排列,能够同时获得 n
和 i
到任意大的数字,没有内存限制,确保当整个迭代器结束时(不管什么时候,即使它在理论上完成多年),所有可能的排列将在没有重复的情况下被穷尽。
最佳答案
首先,您的代码不会生成排列,而是通过替换绘制。其次,迭代器(顾名思义)旨在迭代某些集合,而不是跳转到其中的随机位置(当然,您可以编写自己的 __next__
函数来执行任何您想要的操作 -是否要将结果对象称为迭代器是一个哲学问题)。第三,通过替换生成随机样本是一个经过大量研究和实现的问题。参见示例:https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.random.choice.html
https://stackoverflow.com/questions/62010180/
相关文章:
mongodb - mongoose 事务中创建集合的正确方法
reactjs - React Rich Text Editor 真的可以在移动设备上运行吗?
ethereum - 返回错误 : The method web3_clientVersion do
graphql-java - 读取通过 GraphQL Java 中的变量传递的字段参数
python - 在 tensorflow 2.0 中保存和加载模型
python - psutil.AccessDenied : psutil. AccessDenie
r - 在创建列表 tibble 列时在 "mutation"中使用 dplyr::sym() 会导