2015-10-20 110 views
-2

我有2個函數,1個創建52張卡片並按順序放置它們。另一個功能是洗牌。我已經創建了這個套牌,它是有序的。該結構具有屬性適合和數量我有麻煩洗牌。我需要創建兩個隨機整數,其範圍從1到我們牌組中的牌數。使用這兩個值,我們在這些指數處換牌。重複此交換過程大量(〜1000)次。我不能使用任何MATLAB的功能,如交換或randperm。MATLAB混洗結構數組

這裏是我的函數,它在一個結構數組,並返回的洗好的牌的結構數組:

function shuffle(input) 

r=randi(1,52) 
s=randi(1,52) 
for index=1:52 
temp=input(r).number; 
input(r).number=input(s).number; 
input(s).number=temp; 
end; 
+2

好了...所以在你前面的問題,您不允許使用'randperm',但你可以使用'randi'? – rayryeng

+0

您的代碼看起來應該適用於第一次交換。你得到不正確的結果? – beaker

+0

其實,看起來你只是交換號碼而不是西裝,但這不應該太難修復,對吧? – beaker

回答

0

你有交換想通了,但需要同時包含數字和花色。此外,你不想遍歷52張卡片,你只需要將2張卡片換成1000倍。因此,在shuffle期間添加另一個輸入N以獲得您想要交換的次數,然後相應地使用for循環。此外,你需要有函數輸出洗牌甲板(在C++數組將通過引用傳遞,你不需要輸出,但我不認爲MATLAB會這樣做)。

這應該做的伎倆:

function output = shuffle(input, N) 

% swap two cards N times 
for i = 1:N 
    % pick two random cards each time 
    r = randi(52); 
    s = randi(52); 

    % store one in temporary variables 
    tempNum = input(r).number; 
    tempSuit = input(r).suit; 

    % swap 
    input(r).number = input(s).number; 
    input(r).suit = input(s).suit; 
    input(s).number = tempNum; 
    input(s).suit = tempSuit; 
end 

output = input; 
+0

如果您使用'功能輸入= shuffle(輸入,N)',您將不需要'輸出=輸入;'。 – IKavanagh

+0

確實,我更喜歡用一個新名字來看它,但使用相同的變量確實節省了內存。 –

+0

這只是對*的迴應(在C++中,數組將通過引用傳遞,您不需要輸出,但我不認爲MATLAB會這樣做)。* – IKavanagh