Разное

Matlab rand функция: Создание массивов со случайными элементами MatLab

Случайные числа без повторов

26927 20.09.2015 Скачать пример

Постановка задачи

Предположим, что нам необходимо создать набор целых случайных чисел без повторов в заданном интервале значений. Примеры с ходу:

  • генерация уникальных случайных кодов для товаров или пользователей
  • назначение людей на задачи (каждому по случайной из списка)
  • перестановки слов в поисковом запросе (привет seo-шникам)
  • игра в лото и т.д.

Способ 1. Простой

Для начала рассмотрим простой вариант: нам необходимо получить случайный набор из 10 целых чисел от 1 до 10. Использование встроенной в Excel функции СЛУЧМЕЖДУ (RANDBETWEEN) уникальности не гарантирует. Если ввести ее в ячейку листа и скопировать вниз на 10 ячеек, то запросто могут случиться повторы:

Поэтому мы пойдем другим путем.


Во всех версиях Excel есть функция РАНГ (RANG), предназначенная для ранжирования или, другими словами, определения топовой позиции числа в наборе. Для самого большого числа в списке ранг=1, второе в топе имеет ранг=2 и т.д.

Введем в ячейку А2 функцию СЛЧИС (RAND) без аргументов и скопируем формулу вниз на 10 ячеек. Эта функция сгенерирует нам набор из 10 случайных дробных чисел от 0 до 1:


В соседний столбец введем функцию РАНГ, чтобы определить позицию в рейтинге для каждого полученного случайного числа:


Получим в столбце В то, что хотели — любое нужное количество неповторяющихся случайных целых чисел от 1 до 10.

Чисто теоретически, может возникнуть ситуация, когда СЛЧИС выдаст нам два одинаковых случайных числа в столбце А, их ранги совпадут и мы получим повтор в столбце В. Однако, вероятность такого сценария крайне мала, учитывая тот факт, что точность составляет 15 знаков после запятой.

Способ 2. Сложный


Этот способ чуть сложнее, но использует всего одну формулу массива. Допустим, нам нужно создать на листе список из 9 неповторяющихся случайных целых чисел в интервале от 1 до 50.

Введите в ячейку А2 следующую формулу, нажмите в конце Ctrl+Shift+Enter (чтобы ввести ее как формулу массива!) и скопируйте формулу вниз на требуемое количество ячеек:

Способ 3. Макрос

Ну и, конечно, можно решить задачу с помощью программирования на Visual Basic. В одной из старых статей про случайную выборку я уже приводил  макро-функцию массива Lotto, которая выдает требуемое количество случайных неповторяющихся чисел из заданного интервала.

Ссылки по теме

  • Как подсчитать количество уникальных значений в диапазоне
  • Случайная выборка элементов из списка

Справочник по функциям: rand

Возвращает матрицу со случайными элементами, равномерно распределенными по интервал (0, 1).

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

Вы можете запросить состояние генератора случайных чисел, используя форму

 v = ранд ("состояние")
 

Это возвращает вектор-столбец v длины 625. Позже вы можете восстановить генератор случайных чисел в состояние v , используя форму

 рандов ("государство", в)
 

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

По умолчанию генератор инициализируется с

/dev/urandom , если он доступны, в противном случае из процессорного времени, времени настенных часов и текущего долю секунды. Обратите внимание, что это отличается от MATLAB , который всегда инициализирует состояние в одно и то же состояние при запуске. Чтобы получить поведение сравнимо с 9{19937}-1 (См. М. Мацумото и Т. Нисимура, Mersenne Twister: 623-мерная равнораспределенная форма генератор псевдослучайных чисел , АКМ транс. по моделированию и компьютерному моделированию Vol. 8, № 1, с. 3–30, январь 1998 г., http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html). Используйте , а не для криптографии без безопасного хеширования нескольких возвращаемые значения вместе, в противном случае состояние генератора можно узнать после чтение 624 последовательных значений.

В старых версиях Octave использовался другой генератор случайных чисел. Новый генератор используется по умолчанию, так как он значительно быстрее предыдущего. старый генератор и производит случайные числа со значительно более длинным циклом время. Однако в некоторых случаях желательно получить те же случайные последовательности, что и старые генераторы. Для этого ключевое слово

"seed" используется для указания того, что старые генераторы должны использоваться, как в

 рандов ("сид", вал)
 

, который устанавливает начальное значение генератора на val . Семя Генератор можно запросить с помощью

 с = ранд («начальное число»)
 

Однако следует отметить, что запрос начального числа не вызовет рандов использовать старые генераторы, только установка сид будет. Вызывать рандов , чтобы снова использовать новые генераторы, ключевое слово "состояние"

следует использовать для сброса состояния ранда .

Состояние или начальное значение генератора можно сбросить на новое случайное значение с помощью ключевое слово "сброс" .

Класс возвращаемого значения может управляться завершающим "двойной" или "одиночный" аргумент. Это единственные действительные классы.

См. также: ранд, ранде, ранд, ранд.

Сгенерируйте случайные числа — Видеоурок по MATLAB

Из курса: MATLAB 2018 Essential Training

Генерация случайных чисел

— [Преподаватель] В другом месте этого курса я показал вам, как создавать диапазоны или последовательности чисел, которые следуют шаблону.

Однако многие приложения полагаются на случайные числа. Итак, в этом фильме я покажу вам, как генерировать случайные числа, используя различные методы. Я запустил MATLAB и работаю в пустом командном окне. Самый простой способ создать случайное число — использовать функцию rand. Итак, в командном окне и в командной строке, если я просто наберу rand и Enter, я получу случайное число. Если я снова наберу rand, я получу другое случайное число. Эти числа отображаются только до четырех знаков после запятой, но фактические числа намного длиннее. Еще одна вещь, на которую следует обратить внимание, это то, что случайные числа в MATLAB на самом деле не случайны. Они генерируются алгоритмом, основанным на начальном или начальном значении, и вы можете изменить начальное значение, указав его самостоятельно, перетасовав, что заставляет компьютер пройти процесс выбора нового начального числа, или вы можете изменить его значение по умолчанию, что возвращает его к обычному шаблону на основе системных часов.
Итак, позвольте мне показать вам, как это выглядит. Если вы хотите установить генератор случайных чисел на определенное начальное число, чтобы знать, какими будут результаты, вы вводите rng, за которым следует левая скобка, а затем все, что вы хотите, чтобы начальное число было. Итак, давайте наберем 256 и Enter. Хорошо, это было только внутреннее изменение. Итак, введите rand, и вы получите 0,0458. Если я снова наберу rand, я получу другое значение. Теперь давайте посмотрим, что произойдет, если я посажу те же семена, что и раньше. Итак, наберите левую скобку 256, правую скобку, затем Enter. Опять же, ничего не меняется визуально, а затем я набираю rand и Enter, и получаю обратно 0,0458. Поэтому, когда я знаю, где мы находимся в последовательности, я знаю следующее псевдослучайное число, которое выпадет. Если вы хотите перетасовать, вы можете просто ввести rng обе скобки, а затем одинарную кавычку, потому что вы вводите строку, перемешайте одинарную кавычку, чтобы закрыть строку, а затем нажмите Enter.
Опять же, похоже, ничего не меняется, введите rand, и вы получите другое начальное значение. Вы также можете использовать default, который снова работает с системными часами, и я наберу это, rng в левой скобке, а затем в одинарных кавычках default, за которой следует правая скобка, Enter, а затем rand, и вы видите, что мы получаем другое случайное значение. Теперь давайте предположим, что вы хотите получить случайное значение, которое имеет десятичный компонент, а не целое число. Чтобы получить случайное действительное число от нуля до 100, вы можете умножить число на 100. Итак, вы вводите rand, затем звездочку и 100, Enter и вы получаете 90,5792. Таким образом, базовое значение было 0,905792. Следует отметить, что если бы вы сделали что-то вроде округления этих значений в большую или меньшую сторону, чтобы избавиться от десятичной составляющей, вы не получили бы истинного распределения случайных целочисленных значений, то есть целых чисел. Вместо этого вы можете использовать функцию randi для получения случайным образом распределенных целых чисел от одного до 100.
Таким образом, это равномерное распределение. Итак, я наберу randi, за которой следует левая скобка, а затем левая квадратная скобка, затем начало диапазона, поэтому у меня есть одна запятая 100, за которой следует правая квадратная скобка, чтобы закрыть определение диапазона, правая скобка, затем Enter и я получить 13. Если бы я сделал то же самое, R-A-N-D-I левая скобка, начало списка аргументов левая квадратная скобка одна запятая 100 правая квадратная скобка правая скобка, Enter и я получаю 92 и я могу продолжать это делать. Вы также можете генерировать значения в пределах нормального распределения, и это классическая колоколообразная кривая, где значения в середине распределения имеют тенденцию встречаться чаще, чем значения в хвостах кривой. Если вам нужны нормально распределенные случайные значения от нуля до единицы, вы можете использовать функцию randn. Итак, просто введите randn и Enter, и вы получите 0,3188, снова randn, а затем вы получите — 1,3077, и снова это нормальное распределение или, точнее, стандартное нормальное распределение, поэтому оно имеет среднее или среднее значение, равное нулю, и стандартное отклонение, равное единице.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *