跟进this https://stackoverflow.com/questions/448005/whats-an-easy-way-to-read-random-line-from-a-file-in-unix-command-line问题,我需要准确地得到n
文件中随机的行(或stdin
)。这类似于head
or tail
,除了我想要中间的一些。
现在,除了使用链接问题的解决方案循环遍历文件之外,准确获取问题的最佳方法是什么n
一口气跑几行?
作为参考,我尝试过这个:
#!/usr/bin/perl -w
use strict;
my $ratio = shift;
print $ratio, "\n";
while () {
print if ((int rand $ratio) == 1);
}
where $ratio
是我想要的行的粗略百分比。例如,如果我想要 10 行中的 1 行:
random_select 10 a.list
然而,这并没有给我一个确切的金额:
aaa> foreach i ( 0 1 2 3 4 5 6 7 8 9 )
foreach? random_select 10 a.list | wc -l
foreach? end
4739
4865
4739
4889
4934
4809
4712
4842
4814
4817
我的另一个想法是读取输入文件,然后选择n
从数组中随机选择,但如果我有一个非常大的文件,那就是一个问题。
有任何想法吗?
Edit:这是一个完全相同的副本this https://stackoverflow.com/questions/692312/randomly-pick-lines-from-a-file-without-slurping-it-with-unix问题。
这是我刚刚提出的一个很好的一次性算法,具有 O(N) 时间复杂度和 O(M) 空间复杂度,用于从 N 行文件中读取 M 行。
假设 M
- Let
S
是所选行的集合。初始化S
到第一个M
文件的行。如果最终结果的顺序很重要,请打乱顺序S
now.
- 读入下一行
l
。到目前为止,我们已经阅读了n = M + 1
总行数。我们想要选择的概率l
因为我们的最后一行是M/n
.
- Accept
l
有概率M/n
;使用RNG来决定是接受还是拒绝l
.
- If
l
已被接受,随机选择其中一行S
并将其替换为l
.
- 重复步骤 2-4,直到文件用完所有行,递增
n
每读一个新行。
- 返回集合
S
所选线路。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)