2017-02-16 6 views
5

Я хочу создать два случайных целых числа на интервале [1,n], которые гарантированно отличаются друг от друга. Я чувствую, чтоЭлегантный способ создания двух разных случайных целых чисел

ri(1)=randi([1 n]); 
ri(2)=randi([1 n]); 
while ri(1)==ri(2) 
    ri(2)=randi([1 n]); 
end 

на самом деле не самая гладкая вещь, которую вы можете сделать.

+2

р = [randperm (п, к)] (https://www.mathworks.com/help/matlab/ref/randperm.html) возвращает вектор строки, содержащий k ** уникальные ** целые числа, выбранные случайным образом от 1 до n включительно. –

ответ

8

Один из способов заключается в использовании randperm так, что вы генерировать случайную перестановку n значений, перечисленных от 1 вплоть до n, и возвращать только первые два элемента результата:

ri = randperm(n, 2); 

Старые версии MATLAB не поддерживают вызов randperm таким образом. Старые версии допускают только один вариант ввода, который по умолчанию возвращает всю перестановку значений n. Таким образом, вы можете вызвать randperm используя один входной вариант, то подмножество в конечный результат, чтобы вернуть то, что вам нужно:

ri = randperm(n); 
ri = ri([1 2]); 
+0

Точно. Из документации на «randi»: «Массивы, возвращаемые randi, могут содержать повторяющиеся значения целых чисел, которые иногда упоминаются как выборка с заменой. Чтобы получить уникальные целочисленные значения, иногда называемые выборкой без замены, используйте randperm (RandStream). " –

+0

@EdwardCarney Да, я знал :) Спасибо. – rayryeng

+0

@rayryeng спасибо за решение. И жаль, что не проверял документацию «randi». Я был в «rand»-документации, где они рассказывают вам о «randi» и почему-то не думали о проверке документации «randi» .... – Max

2

Использование randperm для создания двух уникальных значений в диапазоне 1 ... п

out = randperm(n, 2) 
out(1) = number 1 
out(2) = number 2 

Если вы хотите включить 0 в свой диапазон. Затем:

out = randperm(n+1, 2); 
out = out-1; 
out(1) = number 1 
out(2) = number 2 
+0

@rayryeng, true ... Я пришел из мира 'C', где начальный индекс равен 0 0 :) –

+0

@tonytannous Спасибо за ваш ответ и за дополнительную информацию, как Что ж. Я соглашусь с решением луча, так как он сначала поставит, но у вас есть мой upvote;) – Max

+0

@Max :) рад помочь. Да, его ответ объяснил также, как «randperm» работает за кулисами. Я просто пропустил эту часть: D –

2

Вот еще один способ:

ri(1) = randi([1 n]); % choose ri(1) uniformly from the set 1,...,n 
ri(2) = randi([1 n-1]); % choose ri(2) uniformly from 1,...,n-1 
ri(2) = ri(2) + (ri(2)>=ri(1)); % transform 1,...,n-1 into 1,...,ri(1)-1,ri(1)+1,...,n 
+0

@ LuisMendo Спасибо за ваш подход. Для меня это не имело бы значения, но с математической точки зрения эти цифры не были бы стохастически независимыми, или они? – Max

+1

@Max Номера не являются независимыми. Их не может быть, с этим или с любым другим подходом. Поскольку вы хотите, чтобы эти два номера отличались друг от друга, зная, что кто-то говорит вам что-то о другом, поэтому они не являются независимыми. То, что вы хотите (судя по вашему коду), состоит в том, чтобы производить все пары, если разные числа с одинаковой вероятностью. И это то, что делает мой код. Рассмотрим 'n = 7'. Если 'ri (1)' является, например, '3', вторая и третья строки выбирают' ri (2) 'равномерно из множества' 1', '2',' 4', '5',' 6', '7'.Я добавил некоторые комментарии в код, чтобы уточнить –

+0

@ LuisMendo да, вы правы, я имел в виду, если бы 'ri (2)' был равномерно распределен на этом наборе. Спасибо за объяснение – Max

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

  • Нет связанных вопросов^_^