Unfortunately, that algorithm does not avoid unwanted pairs like [1,23] and [23,1].
Here is a naive try until it works approach:
use strict;
use warnings;
use List::Util qw(shuffle);
my (%keys, @rnds, @pairs);
do {
%keys = ();
@rnds = shuffle (0..99);
@pairs = map{ my $r = $rnds[$_];
$keys{"$_,$r"}++;
$keys{"$r,$_"}++;
[ $_, $r ]
} (0..99);
} while ( scalar keys %keys != 200 ); # no symmetry means 200 distinct
+ pairs
# @pairs = shuffle( @pairs ); # uncomment if wanted
printf( "%3d %3d\n", @{$pairs[$_]}) for (0..99);
|