0

私は「シークレット サンタ」イベントを開催していますが、くじを引くという退屈な方法ではなく、教育的な演習として、いくつかの matlab コードを使用してペアリングを行いました。最終結果は、リスト内の各人が、リスト内の他の 1 人へのプレゼントを購入するよう求められることを意味します。コード的に言えば、問題は「このリストから、あなたではなく、他の誰かに選ばれていない人を選ぶ」ということです。

機能するコードがいくつかありますが、それほど堅牢ではありません (奇数の人数がいる場合、無限ループが形成される可能性があります)。また、「本当に」ランダムではないのではないかと思います。より良い方法はありますか?

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 に答える