0

我正在组织一个“秘密圣诞老人”活动,而不是通过抽签来做无聊的方式,我把它变成了一个教育练习,并使用一些 matlab 代码进行配对。最终结果意味着列表中的每个人都被要求为列表中的另一个人购买礼物。Codewise,问题归结为“从这个人列表中,选择一个不是你并且没有被其他人选中的人”。

我有一些有效的代码,但它不是很健壮(如果有奇数人,可能形成无限循环)。我也怀疑它不是“真正的”随机的。还有更好的方法吗?

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
4

2 回答 2

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'
于 2012-11-23T09:25:48.933 回答
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
于 2018-11-16T14:25:48.723 回答