MATLAB ® использует алгоритмы для генерации псевдослучайных и псевдоиндависимых чисел. Эти числа не являются строго случайными и независимыми в математическом смысле, но они проходят различные статистические тесты случайности и независимости, и их вычисление может повторяться в целях тестирования или диагностики.
rand, randi, randn, и randperm функции являются основными функциями для создания массивов случайных чисел. rng функция позволяет управлять начальным числом и алгоритмом, генерирующим случайные числа.
Существует четыре основные функции случайных чисел: 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' | Mersenne Twister (используется по умолчанию при запуске MATLAB) | mt19937ar |
'simdTwister' | SIMD-ориентированный быстрый Мерсенн Твистер | dsfmt19937 |
'combRecursive' | Комбинированное несколько рекурсивных | mrg32k3a |
'multFibonacci' | Мультипликативный отставший Фибоначчи | 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 | shr3cong |
Используйте rng для установки начального значения и генератора, используемых rand, randi, randn, и randperm функции. Например, rng(0,'twister') сбросить генератор в состояние по умолчанию. Чтобы избежать повторения массивов случайных чисел при перезапуске MATLAB, см. раздел Почему случайные числа повторяются после запуска?
Дополнительные сведения об управлении состоянием генератора случайных чисел для повторения вычислений с использованием одних и тех же случайных чисел или для гарантии использования различных случайных чисел в повторных вычислениях см. в разделе Управление генерацией случайных чисел.
rand и randn по умолчанию функции генерируют значения с двойной точностью.
rng('default')
A = rand(1,5);
class(A)ans = '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.6324randi поддерживает как целочисленные типы, так и одинарную или двойную точность.
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