#!/usr/bin/perl use Benchmark "cmpthese"; my $len = shift @ARGV || 12; my $max_reps = shift @ARGV || 2; sub almut { my @set = qw( A B C D E F ); for (1..100) { my $result = ''; while (length($result) < $len) { my $char = $set[ rand @set ]; next if substr($result, -$max_reps) eq $char x $max_reps; $result .= $char; } } } sub salva { my $set = [ qw( A B C D E F ) ]; for (1..100) { my $out = ''; my $last_ix = -1; my $reps = 0; for (1..$len) { my $ix; if ($reps >= $max_reps) { $ix = int rand(@$set - 1); $ix++ if $ix >= $last_ix; } else { $ix = int rand(@$set); } if ($ix == $last_ix) { $reps++; } else { $last_ix = $ix; $reps = 1; } $out .= $set->[$ix]; } } } cmpthese(-1, { almut => \&almut, salva => \&salva, });