(41/92)*(35/91)*(34/90)
####
(#red * (#red-1) * ... (#red-x1+1))
* (#green * (#green-1) * ... (#green-x2+1) * ...
/ ( total * (total-1) * (total-2) * ... )
##
##
(x1+x2+x3+ ...)! / (x1! * x2! * x3! * ... )
##
##
use List::Util 'sum';
sub fact {
my $n = shift;
my $f = 1;
$f *= $_ for 1 .. $n;
$f;
}
## $n * ($n-1) * ... * ($n-$m+1)
sub lower {
my ($n, $m) = @_;
my $result = 1;
$result *= $n-$_ for 0 .. $m-1;
$result;
}
sub prob {
my ($sizes, $sample) = @_;
my $n = @$sizes; ## how many types of items
my $S = sum @$sizes; ## total number of items in the universe
my @sampled = (0) x $n;
my $samplesize = @$sample;
$sampled[$_]++ for @$sample;
## $sampled[x] = how many of type x
## are in this sample?
my $total = fact($samplesize) / lower($S, $samplesize);
$total *= lower($sizes->[$_], $sampled[$_]) / fact($sampled[$_])
for 0 .. $n-1;
$total;
}
## how many ways to get 2 of type 8, 1 of type 3, etc.. ?
print prob( [35000,41000,16000,18000,21000,45000,27000,10000,16000],
[8,8,3,1,5,0,0] );
## output: 0.000397344651946416
##
##
(41/92)*(35/92)*(35/92)
##
##
(#red/total)^x1 * (#green/total)^x2 * ...
##
##
(x1+x2+x3+ ...)! / (x1! * x2! * x3! * ... )
##
##
use List::Util 'sum';
sub fact {
my $n = shift;
my $f = 1;
$f *= $_ for 1 .. $n;
$f;
}
sub prob {
my ($sizes, $sample) = @_;
my $n = @$sizes; ## number of types of items
my $S = sum @$sizes; ## total number of items
my @sampled = (0) x $n;
$sampled[$_]++ for @$sample;
## $sampled[x] = how many of type x
## are in this sample?
my $total = fact(scalar @$sample);
$total *= ( ($sizes->[$_] / $S) ** $sampled[$_] ) / fact($sampled[$_])
for 0 .. $n-1;
$total;
}
## how many ways to get 2 of type 8, 1 of type 3, etc.. ?
print prob( [35000,41000,16000,18000,21000,45000,27000,10000,16000],
[8,8,3,1,5,0,0] );
## output: 0.000397344401565931