加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl 取出放回且子集不重复的组合情况

发布时间:2020-12-16 00:15:32 所属栏目:大数据 来源:网络整理
导读:#!/usr/bin/env perluse warnings;use strict;die "perl $0 样本总个数 样本子集组合 样本子集ne.g. perl $0 96 100 2 96.txt n" unless @ARGV eq 3;my $sample = $ARGV[0]; # 样本数目my $n = $ARGV[1]; # 取出样本的子集数目my $ex_samp = $ARGV[2]; #
#!/usr/bin/env perl
use warnings;
use strict;
die "perl $0 <样本总个数> <样本子集组合> <样本子集>n
e.g. perl $0 96 100 2 > 96.txt n
" unless @ARGV eq 3;

my $sample =  $ARGV[0]; # 样本数目
my $n = $ARGV[1]; # 取出样本的子集数目
my $ex_samp = $ARGV[2]; # 取出样本的个数

my $fac_samp = &fac($sample);
my $fac_ex_samp = &fac($ex_samp);

die "不可能取出比样本数目还要多的情况!!!" if($sample < $ex_samp);
my $c = $fac_samp / ($fac_ex_samp * &fac($sample - $ex_samp));
die "这是一个取出有放回且子集不重复的组合,取出的子集组合不能大于全集所有可能的排列组合!!!" if($n > $c);

my %hash;
for(my $i = 0;$i < $n; $i ++)
{
	my @sub;
	for(my $j = 0; $j < $ex_samp; $j ++)
	{
		push @sub,int(rand($sample) + 1);
	}
	my $str = join "-",sort @sub;
	my $repeat;
	my %rep;
	foreach my $k(@sub)
	{
?		?$rep{$k} ++;
?		?if($rep{$k} eq 2)
		?{
?			??$repeat = 1;
?			??last;
?		?}
	}
	if(exists $hash{$str} or $repeat eq 1)
	{
		$n ++;
	}else{
		$hash{$str} = 0;
		print "$strn";
	}
}

#print "$nn";

sub fac(){
	if($_[0] eq 1)
	{
		return 1;
	}elsif($_[0] eq 0){
		return 1; #可以写0,不过1更好,因为涉及到组合的公式~
	}else{
		return ($_[0] * &fac($_[0] - 1));
	}
}
总的来说,满足等概率取出样本,并且组合形式不重复,涉及到了一些高中的知识,还好没忘。。。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读