对于我的实验,我有20个类别,每个类别包含9张图片。我想以伪随机序列显示这些图片,其中对随机性的唯一约束是一个图像可能不会直接跟随同一类别之一。 所以我需要类似于
的东西 r = randi([1 20],1,180);
只是增加了两个数字的约束,而不是直接相互跟随。 E.g。
14 8 15 15 7 16 6 4 1 8不合法,而
14 8 15 7 15 16 6 4 1 8将会是。
我想到的另一种方法是命名类别A,B,C,... T,让它们重复9次然后随机播放。但是你遇到了同样的问题吗? 我是一个绝对的Matlab初学者,所以欢迎任何指导。
答案 0 :(得分:2)
以下使用模运算来确保每个值与前一个值不同:
m = 20; %// number of categories
n = 180; %// desired number of samples
x = [randi(m)-1 randi(m-1, [1 n-1])];
x = mod(cumsum(x), m) + 1;
代码如何运作
x
的第一个条目是0
和m-1
之间的随机值。每个后续条目代表更改,模m
将提供下一个值(这在第四行中完成)。1
和m-1
之间的更改(而不是0
和m-1
之间的更改),以确保连续值不同。换句话说,给定一个值,下一个值有m-1
(不是m
)选项。1
以将结果值的范围从0
,...,m-1
转换为1
,..., m
。<强>测试强>
获取生成的n-1
向量中的所有(x
)个连续条目对,并计算所有(m^2
)个可能值组合的出现次数:
count = accumarray([x(1:end-1); x(2:end)].', 1, [m m]);
imagesc(count)
axis square
colorbar
已为m=20; n=1e6;
获取以下图像。可以看出,除了具有重复值的对之外,所有组合都(或多或少)具有相同的可能性,这种情况从未发生过。
答案 1 :(得分:1)
您可以以迭代方式查找重复,并将来自同一组[1 20]
的新整数集仅放入发生重复的位置。我们会继续这样做,直到没有重复 -
interval = [1 20]; %// interval from where the random integers are to be chosen
r = randi(interval,1,180); %// create the first batch of numbers
idx = diff(r)==0; %// logical array, where 1s denote repetitions for first batch
while nnz(idx)~=0
idx = diff(r)==0; %// logical array, where 1s denote repetitions for
%// subsequent batches
rN = randi(interval,1,nnz(idx)); %// new set of random integers to be placed
%// at the positions where repetitions have occured
r(find(idx)+1) = rN; %// place ramdom integers at their respective positions
end