@array = sort { 0.5 <=> rand } @array; #### #!/usr/bin/perl use warnings; use strict; $\ = $/; srand 1; # https://perlmonks.org/?node_id=1905 # randomly permutate @array in place my $fisher_yates_shuffle = sub { my $array = shift; my $i = @$array; while ( --$i ) { my $j = int rand( $i+1 ); @$array[$i,$j] = @$array[$j,$i]; } }; my $pseudoshuffle_with_sort = sub { my( $ref_array ) = shift; @{ $ref_array } = sort { 0.5 <=> rand } @{ $ref_array }; }; my $size_of_array = 9; my $A = 'A'; my @array = map { $A ++ } 1 .. $size_of_array; my $times = 10000; my @distribution; @distribution = &distribution_of_occurrences( \@array, $pseudoshuffle_with_sort, $times ); &pretty_squeeze( \@distribution, \@array ); print for '1)', @distribution; @distribution = &distribution_of_occurrences( \@array, $fisher_yates_shuffle, $times ); &pretty_squeeze( \@distribution, \@array ); print for '2)', @distribution; sub distribution_of_occurrences{ my( $ref_array, $shuffle_sub, $times ) = @_; my @distribution; for my $i ( 1 .. $times ){ my @copy_of_array = @{ $ref_array }; $shuffle_sub->( \@copy_of_array ); my $j = 0; map { $distribution[ $j ++ ] .= " " . $_ } @copy_of_array; } return @distribution = map { join ' ', sort { length $a <=> length $b || $a cmp $b } split } @distribution; } sub pretty_squeeze{ my( $ref_distribution, $ref_array ) = @_; my $times_approx = split ' ', $ref_distribution->[ 0 ]; my $del_times = int $times_approx / @{ $ref_array } / 4; s/(\b\w+\b) \K (?:[ ]\1){0,$del_times}//xg for @{ $ref_distribution }; my $k = -1; my $rx_every_second = join '|', grep $k ++ % 2 == 0, @{ $ref_array }; s/\b(?:$rx_every_second)\b/./g for @{ $ref_distribution }; } #### 1) A A A . . . C C C . . . E E E E E . . . . . G G G G G . . . . . I I I I I I I I I I A A A . . . C C C . . . E E E E E . . . . . G G G G G G . . . . . . I I I I I I I A A A . . . C C C . . . E E E E E . . . . . G G G G G G G . . . . . . . I I I I I I A A A . . . C C C C . . . . E E E E E . . . . . G G G G G G . . . . . . I I I I I A A A A . . . . C C C C . . . . E E E E E . . . . . G G G G G . . . . . I I I I A A A A A . . . . . C C C C C . . . . . E E E E E . . . . . G G G G . . . . I I I A A A A A A . . . . . . C C C C C C . . . . . . E E E E . . . . G G G . . . I I A A A A A A A . . . . . . . C C C C C C C . . . . . . . E E E . . . G G G . . . I I A A A A A A A . . . . . . . C C C C C C C . . . . . . . E E E . . . G G . . I I 2) A A A A . . . . C C C C . . . . . E E E E . . . . . G G G G G . . . . I I I I I A A A A . . . . C C C C C . . . . . E E E E E . . . . G G G G G . . . . . I I I I A A A A A . . . . . C C C C . . . . . E E E E . . . . G G G G . . . . . I I I I A A A A A . . . . C C C C C . . . . E E E E E . . . . G G G G . . . . I I I I I A A A A A . . . . . C C C C C . . . . E E E E E . . . . G G G G . . . . . I I I I I A A A A A . . . . C C C C . . . . . E E E E E . . . . . G G G G . . . . I I I I I A A A A . . . . C C C C . . . . . E E E E . . . . . G G G G . . . . . I I I I A A A A . . . . . C C C C . . . . . E E E E . . . . G G G G G . . . . I I I I A A A A . . . . . C C C C . . . . E E E E . . . . . G G G G G . . . . . I I I I