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

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

以上是关于随机将一个列表中的项目与另一个列表中的项目配对的主要内容,如果未能解决你的问题,请参考以下文章

删除列表中与另一个列表中的最大值不对应的项目

如何比较另一个列表中的单个项目?

我如何从列表中随机选择一个项目? [复制]

在看似随机的列表位置插入 CoreData 对象

如何访问列表中的随机项目?

需要 c# 正则表达式将逗号列表中的任何单词与另一个字符串中的任何单词匹配