2017-08-23 37 views
1

我试图使用Matlab的randperm和调用randperm = 5生成1和5之间的随机数。在Matlab中有序的随机数

每次这给我一个不同的阵列,让我们说,例如:

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 34 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] 

有谁知道我可以做这个?

由于

+2

使用'randperm'两个块和一个'randperm(2)'如何索引他们。 – Adriaan

+3

由于您的可能组合数量非常有限,因此请从这些数组中创建一个数组,然后使用'randi'从中随机选取一行。 –

+0

它总是必须是'4 5'吗?没有可能的组合显示'5 4'。 – beaker

回答

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 
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