Chinaunix首页 | 论坛 | 博客
  • 博客访问: 460467
  • 博文数量: 118
  • 博客积分: 4015
  • 博客等级: 上校
  • 技术积分: 1233
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-24 22:11
文章分类

全部博文(118)

文章存档

2013年(5)

2011年(61)

2010年(52)

分类: Python/Ruby

2011-04-18 23:06:21

今天试试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))才是整数
阅读(2632) | 评论(5) | 转发(0) |
给主人留下些什么吧!~~

neobilly2011-04-20 16:32:59

hash是练练手,完全可以做成array,

小雅贝贝2011-04-19 10:43:38

neobilly: 水平有限,老是挨喷,有美女的鼓励,心理舒服多了。.....
不会的啊,日积月累啊,呵呵。都会成功的,加油~~支持~

小雅贝贝2011-04-19 10:43:35

neobilly: 水平有限,老是挨喷,有美女的鼓励,心理舒服多了。.....
不会的啊,日积月累啊,呵呵。都会成功的,加油~~支持~

neobilly2011-04-19 10:22:38

小雅贝贝: 谢谢支持啊。要多多写啊,呵呵。本篇上首页了哦~.....
水平有限,老是挨喷,有美女的鼓励,心理舒服多了。

小雅贝贝2011-04-19 09:50:22

谢谢支持啊。要多多写啊,呵呵。本篇上首页了哦~