2017-08-23 38 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