Числа Pseudorandom сгенерированы детерминированными алгоритмами. Они "случайны" в том смысле, что в среднем они проходят статистические тесты относительно своего распределения и корреляции. Они отличаются от истинных случайных чисел, в которых они сгенерированы алгоритмом, а не действительно вероятностным процессом.
Random number generators (RNG) как те в MATLAB® является алгоритмами для генерации псевдослучайных чисел с заданным распределением.
Для получения дополнительной информации о графический интерфейсе пользователя для генерации случайных чисел от поддерживаемых распределений смотрите, Исследуют Генерацию случайных чисел пользовательский интерфейс.
Методы для генерации псевдослучайных чисел обычно запускаются с универсальных случайных чисел, как MATLAB rand
функция производит. Методы, описанные в этом разделе, детализируют, как произвести случайные числа из других распределений.
Прямые методы непосредственно используют определение распределения.
Например, рассмотрите биномиальные случайные числа. Биномиальное случайное число является количеством голов в броски монеты с вероятностью из головы на любом одном броске. Если вы генерируете универсальные случайные числа на интервале (0,1)
и считайте номер меньше, чем , затем количество является биномиальным случайным числом параметрами и .
Эта функция является простой реализацией биномиального RNG с помощью прямого подхода:
function X = directbinornd(N,p,m,n) X = zeros(m,n); % Preallocate memory for i = 1:m*n u = rand(N,1); X(i) = sum(u < p); end end
Например:
rng('default') % For reproducibility X = directbinornd(100,0.3,1e4,1); histogram(X,101)
binornd
функционируйте использует модифицированный прямой метод, на основе определения биномиальной случайной переменной как сумма Бернуллиевых случайных переменных.
Можно легко преобразовать предыдущий метод в генератор случайных чисел для распределения Пуассона параметром . Распределение Пуассона является ограничивающим случаем биномиального распределения как бесконечность подходов, нуль подходов, и считается зафиксированным в . Чтобы сгенерировать случайные числа Пуассона, создайте версию предыдущего генератора, который вводит вместо и , и внутренне наборы к некоторому большому количеству и к .
poissrnd
функционируйте на самом деле использует два прямых метода:
Метод времени ожидания для маленьких значений
Метод из-за Аренса и Дитера для больших значений
Методы инверсии основаны на наблюдении, что непрерывные кумулятивные функции распределения (cdfs) располагаются однородно на интервале (0,1)
. Если универсальное случайное число на (0,1)
, затем использование генерирует случайное число от непрерывного распределения с заданным cdf .
Например, следующий код генерирует случайные числа от определенного Экспоненциального распределения с помощью инверсии cdf и универсального генератора случайных чисел MATLAB® rand
:
rng('default') % For reproducibility mu = 1; X = expinv(rand(1e4,1),mu);
Сравните распределение сгенерированных случайных чисел к PDF заданного экспоненциала.
numbins = 50; h = histogram(X,numbins,'Normalization','pdf'); hold on x = linspace(h.BinEdges(1),h.BinEdges(end)); y = exppdf(x,mu); plot(x,y,'LineWidth',2) hold off
Методы инверсии также работают на дискретные распределения. Сгенерировать случайное число от дискретного распределения с вектором вероятностной меры где , сгенерируйте универсальное случайное число на (0,1)
и затем набор если .
Например, следующая функция реализует метод инверсии для дискретного распределения с вектором вероятностной меры :
function X = discreteinvrnd(p,m,n) X = zeros(m,n); % Preallocate memory for i = 1:m*n u = rand; I = find(u < cumsum(p)); X(i) = min(I); end end
Используйте функцию, чтобы сгенерировать случайные числа от любого дискретного распределения.
p = [0.1 0.2 0.3 0.2 0.1 0.1]; % Probability mass function (pmf) values
X = discreteinvrnd(p,1e4,1);
В качестве альтернативы можно использовать discretize
функция, чтобы сгенерировать дискретные случайные числа.
X = discretize(rand(1e4,1),[0 cusmsum(p)]);
Постройте гистограмму сгенерированных случайных чисел и подтвердите затем, что распределение следует за заданными pmf значениями.
histogram(categorical(X),'Normalization','probability')
Функциональная форма некоторых распределений мешает или длительный, чтобы сгенерировать случайные числа, использующие прямой или методы инверсии. Методы приемного отклонения обеспечивают альтернативу в этих случаях.
Методы приемного отклонения начинаются с универсальных случайных чисел, но требуют дополнительного генератора случайных чисел. Если ваша цель состоит в том, чтобы сгенерировать случайное число от непрерывного распределения с PDF , методы приемного отклонения сначала генерируют случайное число от непрерывного распределения с PDF удовлетворение для некоторых и все .
Непрерывный RNG приемного отклонения продолжает можно следующим образом:
Выбирает плотность .
Находит константу таким образом, что \forall .
Генерирует универсальное случайное число .
Генерирует случайное число от .
Если , принимает и возвращается . В противном случае, отклонения и переходит к шагу 3.
Для КПД "дешевый" метод необходим для генерации случайных чисел от , и скаляр должен быть малым. Ожидаемое количество итераций, чтобы произвести одно случайное число .
Следующая функция реализует метод приемного отклонения для генерации случайных чисел от PDF данный , , RNG grnd
для , и константа :
function X = accrejrnd(f,g,grnd,c,m,n) X = zeros(m,n); % Preallocate memory for i = 1:m*n accept = false; while accept == false u = rand(); v = grnd(); if c*u <= f(v)/g(v) X(i) = v; accept = true; end end end end
Например, функция удовлетворяет условиям для PDF на (неотрицательный и объединяется к 1). Экспоненциальная PDF со средним значением 1, , доминирует для больше, чем приблизительно 2,2. Таким образом можно использовать rand
и exprnd
сгенерировать случайные числа от :
f = @(x)x.*exp(-(x.^2)/2); g = @(x)exp(-x); grnd = @()exprnd(1); rng('default') % For reproducibility X = accrejrnd(f,g,grnd,2.2,1e4,1);
PDF на самом деле Распределение Релея параметром формы 1. Этот пример сравнивает распределение случайных чисел, сгенерированных методом приемного отклонения со сгенерированными raylrnd
:
Y = raylrnd(1,1e4,1); histogram(X) hold on histogram(Y) legend('A-R RNG','Rayleigh RNG')
raylrnd
функционируйте использует метод преобразования, описывая случайную переменную Рейли в терминах случайной переменной хи-квадрата, которая вы вычисляете использование randn
.
Методы приемного отклонения также работают на дискретные распределения. В этом случае цель состоит в том, чтобы сгенерировать случайные числа от распределения с вероятностной мерой , предположение, что у вас есть метод для генерации случайных чисел от распределения с вероятностной мерой . RNG продолжает можно следующим образом:
Выбирает плотность .
Находит константу таким образом, что \forall .
Генерирует универсальное случайное число .
Генерирует случайное число от .
Если , принимает и возвращается . В противном случае, отклонения и переходит к шагу 3.