MATLAB® использует алгоритмы, чтобы сгенерировать pseudorandom и pseudoindependent числа. Эти числа не являются строго случайными и независимыми в математическом смысле, но они проходят различные статистические тесты случайности и независимости, и их вычисление может быть повторено в целях проверки или диагностики.
rand
, randi
, randn
, и randperm
функции являются основными функциями для создания массивов случайных чисел. rng
функция позволяет вам управлять seed и алгоритмом, который генерирует случайные числа.
Существует четыре основные функции случайных чисел: rand
, randi
, randn
, и randperm
. rand
функция возвращает вещественные числа от 0 до 1, которые рисуются из равномерного распределения. Для примера:
rng('default')
r1 = rand(1000,1);
r1
- вектор-столбец 1000 на 1, содержащая действительные числа с плавающей запятой, извлеченные из равномерного распределения. Все значения в r1
находятся в открытом интервале (0, 1). Гистограмма этих значений примерно плоская, что указывает на довольно равномерную выборку чисел. randi
функция возвращает double
целочисленные значения, взятые из дискретного равномерного распределения. Для примера,
r2 = randi(10,1000,1);
r2
- вектор-столбец 1000 на 1, содержащее целое число значения, извлеченные из дискретного равномерного распределения, области значений которого находится в близком интервале [1, 10]. Гистограмма этих значений примерно плоская, что указывает на довольно равномерную выборку целых чисел между 1 и 10. randn
функция возвращает массивы вещественных чисел с плавающей запятой, которые взяты из стандартного нормального распределения. Для примера:
r3 = randn(1000,1);
r3
- вектор-столбец 1000 на 1, содержащая числа, взятые из стандартного нормального распределения. Гистограмма r3
выглядит как приблизительно нормальное распределение, среднее значение 0 и стандартное отклонение 1.Вы можете использовать randperm
функция для создания double
массив случайных целочисленных значений, не имеющих повторяющихся значений. Для примера,
r4 = randperm(15,5);
r4
- массив 1 на 5, содержащий целые числа, случайным образом выбранные из области значений [1, 15]. В отличие от этого, randi
, который может вернуть массив, содержащий повторные значения, массив, возвращенный randperm
не имеет повторяющихся значений.Последующие вызовы любой из этих функций возвращают различные результаты. Это поведение полезно для создания нескольких различных массивов случайных значений.
MATLAB предлагает несколько опций алгоритма генератора, которые суммируются в таблице.
Значение | Имя генератора | Ключевое слово генератора |
---|---|---|
'twister' | Вихрь Мерсенна (используется по умолчанию при запуске MATLAB) | mt19937ar |
'simdTwister' | SIMD-ориентированный Fast Вихрь Мерсенна | dsfmt19937 |
'combRecursive' | Комбинированное несколько рекурсивных | mrg32k3a |
'multFibonacci' | Мультипликативный Lagged Fibonacci | mlfg6331_64 |
'philox' | Генератор Philox 4x32 с 10 патронами | philox4x32_10 |
'threefry' | Трехфазный генератор 4x64 с 20 патронами | threefry4x64_20 |
'v4' | Устаревший генератор MATLAB версии 4.0 | mcg16807 |
'v5uniform' | Стандартный генератор MATLAB версии 5.0 | swb2712 |
'v5normal' | Устаревший генератор MATLAB версии 5.0 normal | shr3cong |
Используйте rng
функция для установки seed и генератора, используемых rand
, randi
, randn
, и randperm
функций. Для примера, rng(0,'twister')
установите генератор в состояние по умолчанию. Чтобы избежать повторения массивов случайных чисел при перезапуске MATLAB, смотрите, Почему Случайные Числа Повторяются После Запуска?
Для получения дополнительной информации о контроле состояния генератора случайных чисел, чтобы повторить вычисления с использованием тех же случайных чисел или чтобы гарантировать, что различные случайные числа используются в повторных вычислениях, смотрите Управление Генерацией случайных чисел.
rand
и randn
функции генерируют значения двойной точности по умолчанию.
rng('default')
A = rand(1,5);
class(A)
ans = 'double'
Чтобы задать класс как double явным образом:
rng('default') B = rand(1,5,'double'); class(B)
ans = 'double'
isequal(A,B)
ans = 1
rand
и randn
может также сгенерировать значения в одной точности.
rng('default') A = rand(1,5,'single'); class(A)
ans = 'single'
Значения те же, что и при приведении значений двойной точности из предыдущего примера. Случайный поток, из которого берутся функции, продвигается таким же образом независимо от того, какой класс значений возвращается.
A,B
A = 0.8147 0.9058 0.1270 0.9134 0.6324 B = 0.8147 0.9058 0.1270 0.9134 0.6324
randi
поддерживает как целые типы, так и одинарную или двойную точность.
A = randi([1 10],1,5,'double');
class(A)
ans = 'double'
B = randi([1 10],1,5,'uint8');
class(B)
ans = 'uint8'
rand
| randi
| randn
| randperm
| rng