Perl实现排列组合

最开始是想对一个大样本数据集重新排序随机化,只想用简单的随机数生成就设想能够解决,暂时没有考虑分层随机化等方法。

一开始我是用hash的key,不断判断这个key是否exist来防止随机数重复生成,对于几万以内的数据还比较快和方便:
do  
{
$r=int(rand($number));
}while(exists($hash{$r}) || $r>=$number);
$hash{$r}=$line;
但是若number达到几十万之后,速度会非常慢,而且几乎变成了死循环,因为当随机数把0~number-1范围内的数据大部分都产生过后,有非常非常低的概率去随机产生那剩下的一些数值,从极大似然定律来讲,无限小的概率等于不可能事件,因此这么编程是有问题的,对于“大数据”而言。
所以可以用排列来解决这个随机重排列表的问题(不过该方法还是麻烦。其实最简单的方法是随机出N个数字后进行排序,他们的排序后的索引就是1~N的随机数----2013-12-21补充)。
这就涉及到如何进行perl的排列(permutation)和组合(combination)。
================================================================
需要先用PPM安装Algorithm::Combinatorics这个包(或者Math::Combinatorics这个包)
然后就可使用了!!
测试结果:Algorithm::Combinatorics安装失败,但是Math::Combinatorics安装成功。
use Algorithm::Combinatorics qw(combinations permutations);
@data=(1,2,3,4,5);
my $iter = combinations(@data, 2);
while (my $c = $iter->next) {
   print join(" ",@$c),"n";
}

my $iter = permutations(@data);
while (my $c = $iter->next) {
   print join(" ",@$c),"n";
}

Perl实现排列组合》上有3条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注