python - 从大流中选择一个随机元素有什么大不了的?

标签 python

那就是问题所在:

给定一个元素流太大而无法存储在内存中,以均匀的概率从流中选择一个随机元素。

那么为什么“官方”解决方案是这样的:

import random
def pickRandom(stream):
    random_element = None
    for i, e in enumerate(stream):
        if i == 0:
            random_element = e
        elif random.randint(1, i + 1) == 1:
            random_element = e
    return random_element

而不是这个:
import random
random_element = stream[random.randint(0,len(stream))]

最佳答案

扩展我的评论:
我猜这是因为你不能知道 len(stream) 而不用尽(从中读取所有项目)。如果您想象流是一个网络套接字,有人向您发送一堆数据项然后关闭套接字,则您只能从套接字读取数据一次。你不能复制所有的数据(因为它不适合内存(而且,尽管缺乏上下文,我认为这也意味着它也不适合磁盘)所以你有效地拥有1 查看每个数据项,然后它就丢失了。
“官方”(原文如此)解决方案基于一个聪明的数学技巧。顺便说一句,这种问题是我希望在一家糟糕的公司的技术/编码面试测试中看到的那种问题,并且会让我跑一英里。

关于python - 从大流中选择一个随机元素有什么大不了的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58880330/

相关文章:

python - 值错误: Invalid padding bytes when decrypting with AES256

python - 为图像中的每个像素添加值以调整颜色。 python 3

python - 我想将 .csv 文件转换为 Numpy 数组

python - 链接 : fatal error LNK1104: cannot open file 'python37_d.lib'

python - 在 Hadoop 上使用 mrjob 启 Action 业时出错

python - 如何使用 python SAX 解析器获取标签之间的文本?

python - 使用tensorflow tf.control_dependency 和 tf.layers.batch_normalization 出现错误

python - 如何使用 for 循环创建字典列表?

python - 如何从 Telegram 深度链接中提取数据?

python - 如何退出多线程程序?