我正在尝试使用Matlab的randperm
生成1到5之间的随机数并调用randperm = 5
。
每次这给我一个不同的数组时,让我们说:例如:
x = randperm(5)
x = [3 2 4 1 5]
我需要将矢量排列成使得4和5总是彼此相邻而2总是在1和3之间......所以对于例如... [3 2 1 4 5]
或[4 5 1 2 3]
。
基本上我有两个长度不等的“块” - 1 2 3
和4 5
。块的顺序并不那么重要,只有4& 5结束在一起,2在1和3之间。
我基本上只能有4种可能的组合:
[1 2 3 4 5]
[3 2 1 4 5]
[4 5 1 2 3]
[4 5 3 2 1]
有谁知道我怎么做到这一点?
谢谢
答案 0 :(得分:3)
我不确定你是否想要一个能够以某种方式推广到更大问题的解决方案,但根据你在上面描述你的问题的方式,看起来你只有8个可能的组合来满足你的约束:
possible = [1 2 3 4 5; ...
1 2 3 5 4; ...
3 2 1 4 5; ...
3 2 1 5 4; ...
4 5 1 2 3; ...
5 4 1 2 3; ...
4 5 3 2 1; ...
5 4 3 2 1];
您现在可以使用randi
随机选择一行或多行,甚至可以创建anonymous function来为您执行此操作:
randPattern = @(n) possible(randi(size(possible, 1), [1 n]), :)
这允许您随机选择5种模式(每行一种):
>> patternMat = randPattern(5)
patternMat =
4 5 3 2 1
3 2 1 4 5
4 5 3 2 1
1 2 3 5 4
5 4 3 2 1
答案 1 :(得分:2)
您可以生成每个块然后随机播放每个块并将它们设置为单元阵列的成员并随机移动单元阵列,最后将单元阵列转换为矢量。
b45=[4 5]; % block 1
b13=[1 3]; % block 2
r45 = randperm(2); % indices for shuffling block 1
r13 = randperm(2); % indices for shuffling block 2
r15 = randperm(2); % indices for shuffling the cell
blocks = {b45(r45) [b13(r13(1)) 2 b13(r13(2))]}; % shuffle each block and set them a members of a cell array
result = [blocks{r15}] % shuffle the cell and convert to a vector