【问题标题】:Random item from iterator?来自迭代器的随机项?
【发布时间】:2020-09-12 13:12:06
【问题描述】:

我有以下代码

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 任意大的数字约束,确保当整个迭代器结束时(无论何时结束,即使理论上它在几年后结束),所有可能的排列都将在没有重复的情况下用尽。

【问题讨论】:

  • 不完全相关,但为什么number_list = (i for i in range(5)) 和为什么不number_list = range(5)???
  • 因为我有点笨,谢谢:D
  • 如果您想在不重复的情况下迭代产品,我认为答案基本上是“否”。您将需要一个样本空间来进行随机播放,或者您需要跟踪您已经看到的内容。无论哪种方式,您都需要在内存中保留与值的数量成正比的内容。
  • @ThierryLathuille 这是一篇非常有趣的帖子。我仍然在努力解决我无法保证所有排列都会出现并且没有重复的事实。如果我们能有一些数学函数,它会吐出整个集合中所有看似随机的排列,那就太好了。

标签: python random iterator combinations combinatorics


【解决方案1】:

首先,您的代码不会生成排列,而是通过替换绘制。其次,迭代器(顾名思义)旨在通过某些集合进行迭代,而不是跳转到其中的随机位置(当然,您可以编写自己的 __next__ 函数来执行您想要的任何操作 - 无论您想调用结果对象迭代器是一个哲学问题)。第三,产生具有替换的随机样本是一个经过大量研究和实施的问题。例如:https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.random.choice.html

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    相关资源
    最近更新 更多