私は「シークレット サンタ」イベントを開催していますが、くじを引くという退屈な方法ではなく、教育的な演習として、いくつかの matlab コードを使用してペアリングを行いました。最終結果は、リスト内の各人が、リスト内の他の 1 人へのプレゼントを購入するよう求められることを意味します。コード的に言えば、問題は「このリストから、あなたではなく、他の誰かに選ばれていない人を選ぶ」ということです。
機能するコードがいくつかありますが、それほど堅牢ではありません (奇数の人数がいる場合、無限ループが形成される可能性があります)。また、「本当に」ランダムではないのではないかと思います。より良い方法はありますか?
names = {'Alice' 'Bob' 'Carol' 'Dave' 'Esther' 'Frank'};
picklist = names;
c = numel(names)
pairs = cell(c,2);
for ii = 1:c
pairs(ii,1) = names(ii);
match = 1;
while (match == 1)
d = ceil(rand(1)*c);
if ((strcmp(picklist(d),names(ii)) == 0) && (strcmp(picklist(d),'picked') == 0))
pairs(ii,2) = picklist(d);
picklist(d) = {'picked'};
match = 0;
end
end
end
pairs