Pseudorandom числа генерируются детерминированными алгоритмами. Они являются «случайными» в том смысле, что в среднем они проходят статистические тесты относительно своего распределения и корреляции. Они отличаются от истинных случайных чисел тем, что они генерируются алгоритмом, а не действительно случайным процессом.
Random number generators (RNG), такие как в MATLAB® являются алгоритмами для генерации псевдослучайных чисел с заданным распределением.
Для получения дополнительной информации о графическом интерфейсе пользователя для генерации случайных чисел из поддерживаемых распределений, смотрите Исследуйте пользовательский интерфейс генерации случайных чисел.
Методы генерации псевдослучайных чисел обычно начинаются с равномерных случайных чисел, таких как MATLAB rand
функция создает. Способы, описанные в этом разделе, подробно описывают, как получить случайные числа из других распределений.
Непосредственные методы непосредственно используют определение распределения.
Для примера рассмотрим биномиальные случайные числа. Биномиальное случайное число - это количество глав в tosses монеты с вероятностью головок на любой одиночный подброс. Если вы генерируете равномерные случайные числа на интервале (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)
The binornd
функция использует модифицированный прямой метод, основанный на определении биномиальной случайной переменной как суммы случайных переменных Бернулли.
Можно легко преобразовать предыдущий метод в генератор случайных чисел для распределения Пуассона с параметром . Распределение Пуассона является ограничивающим случаем биномиального распределения как приближается к бесконечности, приближается к нулю, и удерживается фиксированным . Чтобы сгенерировать случайные числа Пуассона, создайте версию предыдущего генератора, которая вводит а не и , и внутренних наборов к некоторому большому числу и кому .
The poissrnd
функция фактически использует два прямых метода:
Метод времени ожидания для малых значений
Метод из-за Ahrens и Dieter для больших значений
Методы инверсии основаны на наблюдении, что непрерывные совокупные функции распределения (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 выполняется следующим образом:
Выбирает плотность .
Находит константу таким, что для всех .
Генерирует равномерное случайное число .
Генерирует случайное число от .
Если , принимает и возвращает . В противном случае отклоняет и переходит к шагу 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')
The raylrnd
функция использует метод преобразования, выражая случайную переменную Релея в терминах случайной переменной хи-квадрат, которую вы вычисляете используя randn
.
Методы принятия-отклонения также работают для дискретных распределений. В этом случае цель состоит в том, чтобы сгенерировать случайные числа из распределения с массой вероятностей , принимая, что у вас есть метод для генерации случайных чисел из распределения с массой вероятностей . RNG работает следующим образом:
Выбирает плотность .
Находит константу таким, что для всех .
Генерирует равномерное случайное число .
Генерирует случайное число от .
Если , принимает и возвращает . В противном случае отклоняет и переходит к шагу 3.