python - 来自迭代器的随机项目?

我有以下代码

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 字符的随机排列,能够同时获得 ni 到任意大的数字,没有内存限制,确保当整个迭代器结束时(不管什么时候,即使它在理论上完成多年),所有可能的排列将在没有重复的情况下被穷尽。

最佳答案

首先,您的代码不会生成排列,而是通过替换绘制。其次,迭代器(顾名思义)旨在迭代某些集合,而不是跳转到其中的随机位置(当然,您可以编写自己的 __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 - 读取通过 G​​raphQL Java 中的变量传递的字段参数

python - 在 tensorflow 2.0 中保存和加载模型

python - psutil.AccessDenied : psutil. AccessDenie

r - 在创建列表 tibble 列时在 "mutation"中使用 dplyr::sym() 会导

c# - 在 Swagger 中隐藏参数的最佳方法

javascript - 创建 React 应用程序 + React lazy + Absolute

docker - 如何处理 make missing from alpine docker imag