随机排列一组不相等的重复条目,以便它们不重复



我正在 Matlab Psychtoolbox 中写一个实验,我的条件存储在这样的数组中

Cond = ["VM" "VM" "VN" "VS" "AM" "AM" "AN" "AS" "CM" "CM" "CN" "CS"...
"VM" "VM" "VN" "VS" "AM" "AM" "AN" "AS" "CM" "CM" "CN" "CS"];

我现在想以一种没有重复条件的方式洗牌数组。

关于这个问题有很多治疗方法,例如这个,但他们总是同样经常有每种情况。

一些人建议采用蛮力方法,经常洗牌,直到达到这个标准。但是由于我有这个条件数组的树,并且每次实验运行我必须多次洗牌它们,我认为这不是一个好的解决方案。

希望有人能帮忙

我设计了一种算法,应该满足你的要求。给定一个序列,它将随机对其进行重新排序,以便没有值重复。然而,它似乎确实有创建重复子序列的趋势(例如..."A" "B" "C" "A" "B" "C"...(。我把它包装在一个函数reorder_no_reps中:

function seq = reorder_no_reps(seq)
% Find unique values and counts:
N = numel(seq);
[vals, ~, index] = unique(seq(:), 'stable');
counts = accumarray(index, 1);
[maxCount, maxIndex] = max(counts);
% Check the maximum number of occurrences:
if (2*maxCount-1 > N)
error('Can''t produce sequence without repeats!');
end
% Fill cell array column-wise with permuted and replicated set of values:
C = cell(maxCount, ceil(N/maxCount));
if (3*maxCount-1 > N)
permIndex = [maxIndex(1) ...
setdiff(randperm(numel(vals)), maxIndex(1), 'stable')];
else
permIndex = randperm(numel(vals));
end
C(1:N) = num2cell(repelem(vals(permIndex), counts(permIndex)));
% Transpose cell array and extract non-empty entries:
C = C.';
seq = reshape([C{~cellfun('isempty', C)}], size(seq));
end

算法步骤的说明:

  • 查找输入序列中的唯一值 (vals( 以及它们各自出现的次数 (counts(。
  • 找到单个值的最大出现次数(maxCounts(,并检查它是否太大而无法在没有 prepreat 的情况下创建序列。
  • 随机排列顺序同时应用于唯一值及其计数。如果最大出现次数超过给定阈值,则相应的值索引将移动到随机顺序的开头(原因将在下一个项目符号中解决(。
  • 然后,每个唯一值按其在序列中的出现次数就地复制。单元格数组按列顺序填充这些复制值,可能会将末尾的某些单元格留空。由于单元格数组的行数等于某个值的最大出现次数,因此生成的单元格数组中没有一行的值会多次出现。此外,每行中的最后一个值应与下一行中的第一个值不同(在某些情况下,通过首先填充最常出现的值来确保(。
  • 转置单元格数组,然后按列顺序提取所有非空单元格值,并将它们调整为与输入序列相同的大小。这与从非转置单元格数组中逐行拉取值相同,这应该为您提供一个没有重复值的序列。

相关内容

  • 没有找到相关文章

最新更新