Произведите 6 разных чисел, используя только "randi" и несколько циклов - PullRequest
0 голосов
/ 12 марта 2019

Я хочу использовать только «randi» для этой функции, чтобы случайным образом получить 6 разных чисел в matlab, и диапазон этих 6 чисел составляет 1 ~ 12.

number=randi([1,12],1,6)
c=0;
        for n=1:6%when "n" is 1 to 6
            while c <= 6  %while c is less equal than 6,do the program below  
                  c = c + 1; %c=c+1
                  if number(n) == number(c) %when the nth element is equal to cth element
                     number(n) = randi(12); %produce a random integer in the nth element
                     c = 0; %the reason why i set c=0 again is because i want to check again whether  the new random integer is the same as cth element or not
                  end
            end
        end   
final_number=number

, но результат все еще показывает мнекак

1 "2" 6 11 "2" 3

5 "8" "8" 12 3 1

Как улучшить код для получения 6 различных чисел.i я не хочу всегда слишком полагаться на удобную инструкцию matlab, поэтому мои теги также будут писать c.hoping, кто-то может помочь мне улучшить это

Ответы [ 3 ]

1 голос
/ 13 марта 2019

Если вы пытаетесь воспроизвести randsample (или randperm), почему бы просто не воспроизвести алгоритм, который использует MATLAB? (Насколько мы можем судить ...)

Это тасовка Фишера-Йейтса . Если у вас есть вектор v, каждая итерация выбирает случайный, ранее не использованный элемент и помещает его в конец невыбранных элементов. Если вы выполните k итераций, последними k элементами списка будут ваши случайные выборки. Если k равно количеству элементов в v, вы перетасовали весь массив.

function sample = fisher_yates_sample(v, k)
   % Select k random elements without replacement from vector v
   % if k == numel(v), this is simply a fisher-yates shuffle
   for n = 0:k-1
      randnum = randi(numel(v)-n);   % choose from unused values
      % swap elements v(end-n) and v(randnum)
      v([end-n, randnum]) = v([randnum, end-n]);
   end
   sample = v(end-k+1:end);
end

В отличие от версии MATLAB, мой требует ввода вектора, поэтому для получения 6 случайных значений в диапазоне 1:12 вы бы вызвали функцию следующим образом:

>> fisher_yates_sample(1:12,6)
ans =

    5   11    6   10    8    4
1 голос
/ 12 марта 2019

Поскольку вы перебираете одно случайное число, когда оно встречается несколько раз, почему бы просто не перевыбрать все числа одновременно?

% Initial selecting of random numbers.
number = randi([1, 12], 1, 6)

% While the amount of unique elements in numbers is less than 6:
while (numel(unique(number)) < 6)

  % Re-select random numbers.
  number = randi([1, 12], 1, 6)

end

И так как вы написали, вы специально хотите использовать метод randi, я думаю, что есть причина, вы не хотите использовать randperm(12, 6)!?

0 голосов
/ 12 марта 2019

То, что вы ищете, это randperm.Он производит случайную перестановку диапазона целых чисел, поэтому, если вы выберете первые k числа, вы будете уверены, что получите k уникальных целых чисел в диапазоне [1; n].

Inваш случай, просто позвоните:

randperm(12,6)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...