2015-10-20 3 views
-2

У меня есть 2 функции, 1 которые создают колоду из 52 карт и ставят их в порядок. Другая функция перетасовывает карты. Я создал колоду, и она в порядке. В структуре есть атрибуты и номер, с которыми мне сложно перемешать. Мне нужно создать два случайных числа, которые варьируются от 1 до количества карт в нашей колоде. Используя эти два значения, мы меняем карты по этим индексам. Повторите этот процесс обмена большим (~ 1000) числом раз. Я не могу использовать любые функции MATLAB, такие как swap или randperm.MATLAB shuffling structure array

Вот моя функция, которая принимает в массиве структуры и возвращает структуру массива перемешиваются карт:

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

Ok ... так что в вашем предыдущем вопросе, вы не разрешали использовать 'randperm', но вы можете использовать' randi'? – rayryeng

+0

Ваш код выглядит так, как будто он должен работать для первого свопа. Вы получаете неправильные результаты? – beaker

+0

На самом деле, похоже, что вы только меняете номер, а не костюм, но это не должно быть слишком сложно исправить, верно? – beaker

ответ

0

Вы своп понял, но должны включать как номер и костюм. Кроме того, вы не хотите проходить через 52 карты, вы хотите просто поменять 2 карты ~ 1000 раз. Поэтому добавьте еще один вход 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

Если вы используете 'function input = shuffle (input, N)' вам не понадобится ' output = input; '. – IKavanagh

+0

Правда, я предпочитаю видеть это с новым именем, но с использованием той же переменной сохраняет память. –

+0

Это было только в ответ на * (в C++ массив передавался по ссылке, и вам не нужен вывод, но я не думаю, что MATLAB это сделает). * – IKavanagh