我正在组织一个“秘密的圣诞老人”活动,而不是通过抽签来做无聊的方式,我已经把它变成了一个教育练习,并使用一些matlab代码进行配对。最终结果意味着要求列表中的每个人为列表中的另一个人购买礼物。从代码方面来说,问题归结为“从这个人名单中选择一个不是你而且没有被其他人选中的人”。
我有一些有用的代码,但它不是非常强大(如果有一个奇怪的人数,它可能形成一个无限循环)。我也怀疑它不是“真正”随机的。有更好的方法吗?
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
答案 0 :(得分:4)
为时已晚,我可能会遗漏一些东西。
names = {'Alice' 'Bob' 'Carol' 'Dave' 'Esther' 'Frank'};
idx = randperm(length(names));
thisGroup = names(idx);
thatGroup = names( mod(idx,length(idx))+1);
给出
thisGroup =
'Bob' 'Alice' 'Esther' 'Dave' 'Frank' 'Carol'
thatGroup =
'Carol' 'Bob' 'Frank' 'Esther' 'Alice' 'Dave'
答案 1 :(得分:0)
我编写了一个脚本,以确保所有配对都不相同,然后将其放入文件中,并以人名作为文件名,并将与之配对的人放入文件中。
然后可以将这些消息发送给其他人,而无需任何人(包括运行代码的人)知道哪些人已配对:
names = {'A' 'B' 'C'}
% create two groups that are the same
Group_A = {' '};
Group_B = {' '};
% if groups are the same at any index repair
while sum(cellfun(@strcmp,Group_A,Group_B))>0;
idx = randperm(length(names));
Group_A = names
Group_B = names(idx) ;
end
% Create .txt Files
for i = 1:length(names)
filename = sprintf('%s.txt', Group_A{i})
fid = fopen(filename, 'w');
fprintf(fid, '%s', Group_B{i});
end