随机将一个列表中的项目与另一个列表中的项目配对
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随机将一个列表中的项目与另一个列表中的项目配对相关的知识,希望对你有一定的参考价值。
我正在组织一个“秘密的圣诞老人”活动,而不是通过抽签来做无聊的方式,我已经把它变成了一个教育练习,并使用一些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
答案
现在为时已晚,我可能会遗漏一些东西。
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'
另一答案
我编写了一个脚本,确保所有配对都不同,然后将它们放入文件中,其中包含人名作为文件名以及文件中与之配对的人。
然后可以将这些内容发送给没有任何人的人,包括运行代码的人知道哪些人配对:
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
以上是关于随机将一个列表中的项目与另一个列表中的项目配对的主要内容,如果未能解决你的问题,请参考以下文章