perl pickFromRange.pl [ count [ max | min max ] ] pickFromRange [ count [ max | min max ] ] #### #!/usr/bin/perl -w use strict; sub pickFromRange { my( $count, $min, $max )= @_; my $range= $max - $min + 1; die "pickFromRange: $max - $min + 1 < $count" if $range < $count; my @pick; my %replace; while( 0 < $count-- ) { my $pick= $min + int( rand($range) ); my $next= $replace{$pick}; push @pick, defined($next) ? $next : $pick; # push @pick, $replace{$pick} // $pick; $next = $replace{$max}; $replace{$pick}= defined($next) ? $next : $max; # $replace{$pick}= $replace{$max} // $max; delete $replace{$max--}; $range--; } return @pick; } my $count= @ARGV ? shift(@ARGV) : 20; my( $min, $max )= !@ARGV ? (100,999) : 1==@ARGV ? (1,@ARGV) : @ARGV; my @pick= pickFromRange( $count, $min, $max ); print "@pick\n";