随机将一个列表中的项目与另一个列表中的项目配对

时间:2012-11-23 09:06:36

标签: list matlab

我正在组织一个“秘密的圣诞老人”活动,而不是通过抽签来做无聊的方式,我已经把它变成了一个教育练习,并使用一些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

2 个答案:

答案 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