#! perl -slw use strict; our $ITERS ||= 1000; our $PICKS ||= 4; sub genPicker { my $n = shift; my @indices = 0 .. $n - 1; return sub { return unless @indices; my $index = int rand @indices; my $choice = $indices[ $index ]; $indices[ $index ] = $indices[ $#indices ]; --$#indices; return $choice; }; } my $n = 1; my @data = map{ ( $_ ) x ( $n *=2 ) } 'A' .. 'F'; print "Required frequencies"; for my $value ( 'A' .. 'F' ) { printf "$value : %.1f\n", grep( { $_ eq $value } @data ) / @data * 100; } my %chosen; for ( 1 .. $ITERS ) { my $picker = genPicker ( scalar @data ); my %picks; while( keys %picks < $PICKS ) { my $pick = $picker->(); my $value = $data[ $pick ]; $picks{ $value }++ ; } $chosen{ $_ }++ for keys %picks; } print "\nActual frequencies:"; printf "$_ : %.1f\n", $chosen{ $_ } / ($ITERS * $PICKS) * 100 for sort{ $chosen{ $a } <=> $chosen{ $b } } keys %chosen;