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

  • 内容
  • 相关
小蓝博客收集整理的这篇文章主要介绍了perl 取出放回且子集不重复的组合情况,小蓝博客小编觉得挺不错的,现在分享给大家,也给大家做个参考。
#!/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 "$str\n";
	}
}

#print "$n\n";

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

总结

以上是小蓝博客为你收集整理的perl 取出放回且子集不重复的组合情况全部内容,希望文章能够帮你解决perl 取出放回且子集不重复的组合情况所遇到的程序开发问题。

如果觉得小蓝博客网站内容还不错,欢迎将小蓝博客网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

  • 打赏支付宝扫一扫
  • 打赏微信扫一扫
  • 打赏企鹅扫一扫

本文标签:

版权声明:若无特殊注明,本文皆为《小蓝博客》原创,转载请保留文章出处。

本文链接:perl 取出放回且子集不重复的组合情况 - https://www.nswin.cc/41797.html