Числа Pseudorandom сгенерированы детерминированными алгоритмами. Они "случайны" в том смысле, что в среднем они проходят статистические тесты относительно своего распределения и корреляции. Они отличаются от истинных случайных чисел, в которых они сгенерированы алгоритмом, а не действительно вероятностным процессом.
Random number generators (RNG) как те в MATLAB® является алгоритмами для генерации псевдослучайных чисел с заданным распределением.
Для получения дополнительной информации о графический интерфейсе пользователя для генерации случайных чисел от поддерживаемых дистрибутивов смотрите, Исследуют Генерацию случайных чисел пользовательский интерфейс.
Методы для генерации псевдослучайных чисел обычно запускаются с универсальных случайных чисел, как rand
MATLAB, который производит функция. Методы, описанные в этом разделе, детализируют, как произвести случайные числа из других дистрибутивов.
Прямые методы непосредственно используют определение распределения.
Например, рассмотрите биномиальные случайные числа. Биномиальное случайное число является количеством голов в бросках монеты с вероятностью головы на любом одном броске. Если вы генерируете универсальные случайные числа на интервале (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 заданного экспоненциала путем масштабирования PDF к области гистограммы раньше отображало распределение:
numbins = 50; h = histogram(X,numbins); hold on histarea = h.BinWidth*sum(h.Values); x = h.BinEdges(1):0.001:h.BinEdges(end); y = exppdf(x,mu); plot(x,histarea*y,'r','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 vector
X = discreteinvrnd(p,1e4,1);
h = histogram(X,length(p));
bar(1:length(p),h.Values)
Функциональная форма некоторых дистрибутивов мешает или длительный, чтобы сгенерировать случайные числа, использующие прямой или методы инверсии. Методы приемного отклонения обеспечивают альтернативу в этих случаях.
Методы приемного отклонения начинаются с универсальных случайных чисел, но требуют дополнительного генератора случайных чисел. Если ваша цель состоит в том, чтобы сгенерировать случайное число от непрерывного распределения с PDF, методы приемного отклонения сначала генерируют случайное число от непрерывного распределения с PDF, удовлетворяющим для некоторых и так далее.
Непрерывный RNG приемного отклонения продолжает можно следующим образом:
Выбирает плотность.
Находит константу таким образом это для всех.
Генерирует универсальное случайное число.
Генерирует случайное число от.
Если, принимает и возвращается. В противном случае отклонения и переходят к шагу 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 продолжает можно следующим образом:
Выбирает плотность.
Находит константу таким образом это для всех.
Генерирует универсальное случайное число.
Генерирует случайное число от.
Если, принимает и возвращается. В противном случае отклонения и переходят к шагу 3.