#!perl -slw use strict; use List::Util qw/ shuffle /; sub x { my( $N, @M ) = @_; my ($minus_1, $minus_2) = ($M[rand @M], $M[rand @M]); my $str = $minus_1 . $minus_2; for (1 .. $N - 2) { my $idx = rand @M; $idx = ($idx + (int(rand $#M) + 1)) % @M if $minus_1 eq $minus_2 && $M[$idx] eq $minus_2; $str .= $M[$idx]; ($minus_1, $minus_2) = ($minus_2, $M[$idx]); } return $str; } for( 1 .. 100 ) { my $x = x( 12, qw[ A B C D E F ] ); print $x, $x =~ m[(.)\1\1] ? ' Fail' : ' Ok'; }