http://qs321.pair.com?node_id=161252
 Description: Another cook book - "The Practice of Programming" by Kernighan and Pike. And again, realization of "Markov chains algorithm" on page 123 can and must be optimized! So clever C/C++/Java examples and so ugly Perl example... :-(
```#
# variant from "The Practice of Programming"
#

#!/usr/bin/perl
\$MAXGEN  = 10000;
\$NONWORD = "\n";
\$w1 = \$w2 = \$NONWORD;
while (<>) {
foreach (split) {
push(@{\$statetab{\$w1}{\$w2}}, \$_);
(\$w1, \$w2) = (\$w2, \$_);
}
}
push(@{\$statetab{\$w1}{\$w2}}, \$NONWORD);

\$w1 = \$w2 = \$NONWORD;
for (\$i=0; \$i<\$MAXGEN; \$i++) {
\$suf = \$statetab{\$w1}{\$w2};
\$r = int(rand @\$suf);
exit if ((\$t = \$suf->[\$r]) eq \$NONWORD);
print "\$t\n";
(\$w1, \$w2) = (\$w2, \$t);
}

#
# my variant
#

#!/usr/bin/perl -a0n
push @{\$m{\$F[\$_-1]}{\$F[\$_]}}, \$F[\$_+1] for 1..\$#F;
1 while defined(\$F[2+\$i++] = splice @{\$m{\$F[0+\$i]}{\$F[1+\$i]}},
rand(@{\$m{\$F[0+\$i]}{\$F[1+\$i]}}), 1);
print join(" ",@F[0..1+\$i]),"\n";
```