perl hash 和 rand的示例 随机从样本抽出1000条样本

2708阅读 5评论2011-04-18 neobilly
分类:Python/Ruby

今天试试perl的rand
rand(expr)返回的是浮点数,而
int(rand(expr))返回的是整数,比如int(rand(100))返回的就是一个0-99的整数
然后说说需求,师兄有个文件,格式是两行以个记录,奇数行是序列,偶数行是序列的名字,(0,1)为第一条记录,(1,2)为第二条记录,如图所示

然后,该师哥就想从这个文件中随机抽出1000条记录,保存到一个文件,剩余的保存到另外的文件中,
我首先想到的就是rand + hash来解决这个问题,这就是我的代码,
  1. #sample.pl
  2. #!/usr/bin/perl
  3. my $in = $ARGV[0];
  4. my %lns = ();# ln => 1 means get
  5. die "No sampled file\n" if(!defined($in));
  6. open RH,$in or die "$!";
  7. my @lines = <RH>;chomp @lines;
  8. close RH or die "$!";
  9. my $recs = ($#lines + 1) / 2;# get the records count
  10. for(my $i = 0; $i < 1000; $i++){
  11.   my $tln ;
  12.   do{
  13.     $tln = int(rand($recs));
  14.   }while($lns{"$tln"} == 1);
  15.   # $tln is not got yet
  16.   $lns{"$tln"} = 1;
  17. }
  18. for(keys %lns){
  19.    print $_,"\n";
  20. }
  21. open WH1,">A" or die "$!";
  22. open WH2,">Left" or die "$!";
  23. for($i = 0; $i < $recs ; $i ++){
  24.   if($lns{"$i"} == 1){
  25.     # print sampleOut
  26.     print WH1 $lines[($i - 1) * 2]."\n";
  27.     print WH1 $lines[($i - 1) * 2 + 1]."\n";
  28.   }else{
  29.     # print the left
  30.     print WH2 $lines[($i - 1) * 2]."\n";
  31.     print WH2 $lines[($i - 1) * 2 + 1]."\n";
  32.   }
  33. }
  34. close WH1 or die "$!";
  35. close WH2 or die "$!";


运行后的结果如下

文件A

尤其要注意的是文件的最后一行没有换行符,所以保险起见,应该对每行chomp,然后手动
每行print "\n",还有就是要注意 int(rand(int))才是整数
上一篇:windows 下简单的进度条 \b的使用
下一篇:OpenSUSE YaST Network Settings

文章评论