First you want a clean set of pairings. Andy meeting Bob is pretty similar to Bob meeting Andy, and meeting yourself is pretty lonely, so we take the unique sorted pairs possible, and drop the equal ones:
pairings = Select[Union[Sort /@ Tuples[{Range[16], Range[16]}]], #[[1]] != #[[2]] &];
Partitioning is a very nice way to skip lots of these problems, but makes keeping track of pairs more complicated. Instead I remove repeated people every time I pick a pair.
pairs = RandomSample[pairings, 1];
Table[
notUsed = Select[pairings, Nor @@ (MemberQ[Flatten[pairs], #] & /@ #) &];
pairs = Append[pairs, RandomSample[notUsed, 1][[1]]];
, {n, 7}];
pairs
Now we have a week, we can scrub these pairings from our sample and go again.
pairings = Complement[pairings, pairs];
All together:
pairings = Select[Union[Sort /@ Tuples[{Range[16], Range[16]}]], #[[1]] != #[[2]] &];
Table[
pairs = RandomSample[pairings, 1];
Table[
notUsed = Select[pairings, Nor @@ (MemberQ[Flatten[pairs], #] & /@ #) &];
pairs = Append[pairs, RandomSample[notUsed, 1][[1]]];
, {n, 7}];
pairings = Complement[pairings, pairs];
pairs
, {m, 7}]
Note that we can choose badly pretty easily. I ran this a few times to get a full list, as several random selections made further selection by our rules impossible!