有内置方法可以做到这一点吗?如果不是,我怎样才能在不花费太多开销的情况下做到这一点?
不是内置的,而是算法R(3.4.2)
(Waterman 的“Reservoir Algorithm”)来自 Knuth 的“计算机编程的艺术”很好(非常简化的版本):
import random
def random_line(afile):
line = next(afile)
for num, aline in enumerate(afile, 2):
if random.randrange(num):
continue
line = aline
return line
The num, ... in enumerate(..., 2)
迭代器产生序列 2, 3, 4...randrange
因此将为 0,概率为1.0/num
-- 这就是我们必须替换当前所选行的概率(引用算法的样本大小为 1 的特殊情况 -- 请参阅 Knuth 的书以获取正确性证明 == 当然,我们也遇到以下情况一个足够小的“水库”以适合内存;-))...以及我们的概率do so.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)