2015-10-20 64 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