#! 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; #### C:\test>618798 -ITERS=1e4 -PICKS=1 Required frequencies A : 1.6 B : 3.2 C : 6.3 D : 12.7 E : 25.4 F : 50.8 Actual frequencies: A : 1.7 B : 3.1 C : 6.4 D : 12.4 E : 25.3 F : 51.1 #### C:\test>618798 -ITERS=1e4 -PICKS=2 Required frequencies A : 1.6 B : 3.2 C : 6.3 D : 12.7 E : 25.4 F : 50.8 Actual frequencies: A : 2.1 B : 4.2 C : 8.1 D : 15.4 E : 29.5 F : 40.8 #### C:\test>618798 -ITERS=1e4 -PICKS=3 Required frequencies A : 1.6 B : 3.2 C : 6.3 D : 12.7 E : 25.4 F : 50.8 Actual frequencies: A : 3.0 B : 5.7 C : 11.3 D : 20.2 E : 28.0 F : 31.7 C:\test>618798 -ITERS=1e4 -PICKS=4 Required frequencies A : 1.6 B : 3.2 C : 6.3 D : 12.7 E : 25.4 F : 50.8 Actual frequencies: A : 4.5 B : 8.9 C : 16.1 D : 21.6 E : 24.0 F : 24.9 #### C:\test>618798 -ITERS=1e4 -PICKS=6 Required frequencies A : 1.6 B : 3.2 C : 6.3 D : 12.7 E : 25.4 F : 50.8 Actual frequencies: F : 16.7 A : 16.7 D : 16.7 C : 16.7 E : 16.7 B : 16.7