2014-11-21 3 views
0

У меня есть алгоритм случайного выбора элемента t в массиве с повторением. Это более подробно алгоритм enter image description hereСлучайный выбор числа в массиве без повторения

Это может объяснить, как folowing:

  1. Начальное индекс массива ¯u, который хранит индекс чисел от 1 до K (строка 1 до 3)
  2. Установить начальное гаммы от k и уменьшаться на единицу для каждой итерации. Цель гамма - без повторения (строка 4,9,10)
  3. Случайное выберите число t от 1 до N (в j = 1, выберите 1 к k, N - нереформированное число), а затем установите число до конца массива.
  4. Повторите шаг 2 - 3
  5. Если гамма = 0, сбросьте гамму = k Эта функция вернет t.

Например, у меня есть массив A=[1,2,3,4,5,6,7,8,9], k=9 =size(A), N=12 (от 1 до 9, номер выбирается только один раз). Теперь я хочу использовать этот алгоритм для случайного выбора номера t из массива A. Это мой код. Однако он не похож на линию 6 в алгоритме. Это правильно? Посмотрим, мой код помощь мне

function nonRepeat 
    k=9; 
    u=1:k; % initial value of index 
    N=12 
    gamma=k; 
    for j=1:N 
     index=randi(gamma,1); % use other choosing 
     t=u(index) 
     %%swapping 
     temp=u(t); 
     u(t)=u(gamma); 
     u(gamma)=temp; 
     gamma=gamma-1; 
     if gamma==0 
      gamma=k; 
     end 
    end 
end 
+1

Я думаю, что вы можете начать с более аккуратно форматирование кода. Тогда объясните, что вы подразумеваете под этим, это плохо работает. – lightalchemist

+0

Я его чищу. Я запускаю его, но один элемент выбирает 2 раза в диапазоне от 1 до k – user8264

+0

@ user8264, откуда вы знаете, что он выбирает один номер дважды? Я просто даю один номер. – Rashid

ответ

0

Я думаю index=randi(gamma,1); не прав, потому что он говорит выбрать номер t случайным образом, но вы выбираете index случайным образом и назначить t=u(index).

Смотрите, если он работает,

k = 9; 
u = 1 : k; 
N = 12; 
gamma = k; 
for j = 1 : N 
    t = randi(gamma,1); 
    temp = u(t); 
    u(t) = u(gamma); 
    u(gamma) = temp; 
    gamma = gamma - 1; 
    if gamma == 0 
     gamma = k; 
    end 
end 
+0

@ Kamtal. Это неверно, ваш результат 6 2 7 3 4 3 2 2 1 3 9 8. Посмотрите, что цифры, имеющие индекс от 1 до 9: 2, появляются дважды. Это неверно. В диапазоне от 1 до k каждый номер должен появляться 1 раз – user8264

+0

@ user8264, как вы получаете '6 2 7 3 4 3 2 2 1 3 9 8' используя' nonrepeat'? – Rashid

+0

Я просто запускаю ваш код. Это ваш результат. Мой ожидаемый результат состоит в том, что каждый номер появляется только один раз в диапазоне от 1 до k – user8264

Смежные вопросы