从文本文件中随机抽提一行的方法

  • 使用高德纳的算法

  • 1
    2
    3
    4
    5
    6
    7
    
    $line;
    $n = 0;
    srand;
    while(《》) {
        $n++;
        $line = $_ if (rand(1/$n));
    }

    以上代码可以简写为:

    1
    2
    
    srand;
    rand($.)1 && ($line = $_) while 《》;

    此算法的优点在于不需要把整个文件都保存到内存中去,尤其适合处理行数超多的文件。

  • 使用File::Random模块

  • 1
    2
    
    use File::Random qw/random_line/;
    my $line = random_line($filename);
  • 使用Tie::File模块(略)

  • 参考资料

  • perldoc -q “random line”
    Picking a Random Line from a File
    水塘抽样(维基百科)
    pick N random lines from a file