2014-02-17 3 views
4

Мне нужно сгенерировать m уникальных случайных чисел в диапазоне от 1 до n. В настоящее время я реализовал следующее:Как создать уникальные случайные числа в Matlab?

round(rand(1,m)*(n-1)+1) 

Однако некоторые числа повторяются в массиве. Как я могу получить только уникальные номера?

ответ

13

Вы можете использовать randperm.

Из описания:

p = randperm(n,k) возвращает вектор-строку, содержащую целые числа K уникальных , выбранных случайным образом от 1 до п включительно.

Таким образом, randperm(6,3) может быть вектор

[4 2 5] 

Update

Два аргумента версия randperm только появилась в R2011b, так что если вы используете более раннюю версию MATLAB, то вы будете см. эту ошибку. В этом случае используйте:

A = randperm(n); 
A = A(1:m); 
4

randperm подход описывается @Stewie, как представляется, путь в большинстве случаев. Однако, если вы можете использовать Matlab только с 1 входным аргументом, а n действительно большой, возможно, нецелесообразно использовать randperm для всех номеров и выбрать первые несколько. В этом случае здесь является то, что вы можете сделать:

  1. Сформировать целое число от 1 до n
  2. Сформировать целое число от 1 до n-1, это выбор из доступных чисел.
  3. Повторяйте до тех пор, пока у m номера

Это может быть сделано с randi и даже может быть векторизации, просто рисуя много случайных чисел на каждом шаге, пока единственная сумма не является правильным.

+0

Это работает, но меньше времени эффективно. Причина в том, что он должен написать код, чтобы найти значение индексированного целого. – George

+1

@George Менее эффективен относительно. Я еще не видел решения до 2011 года, которое может иметь дело с 'n = 1e11' или поэтому, следовательно, я думаю, что это еще что-то добавляет. –

+0

Это, безусловно, делает, но я думаю, что было бы более эффективно реализовать последнюю версию randperm. – George

5

Как указано выше, в версиях Matlab старше, чем R2011b randperm принимает только один входной аргумент. В этом случае самый простой подход, предполагая, что у вас есть статистика Toolbx, является использование randsample:

randsample(n,m) 
-1

Это может быть сделано путем сортировки случайный вектор поплавков:

[i,i]=sort(rand(1,range)); 
output=i(1:m); 
Смежные вопросы