Псевдослучайные числа генерируются детерминированными алгоритмами. Они являются «случайными» в том смысле, что в среднем они проходят статистические тесты относительно их распределения и корреляции. Они отличаются от истинных случайных чисел тем, что генерируются алгоритмом, а не действительно случайным процессом.
Генераторы случайных чисел (RNG), подобные таковым в MATLAB ®, являются алгоритмами для генерации псевдослучайных чисел с заданным распределением.
Дополнительные сведения о графическом интерфейсе пользователя для генерации случайных чисел из поддерживаемых распределений см. в разделе Обзор пользовательского интерфейса генерации случайных чисел.
Методы генерации псевдослучайных чисел обычно начинаются с однородных случайных чисел, таких как MATLAB rand функция производит. Методы, описанные в этом разделе, подробно описывают, как производить случайные числа из других распределений.
Прямые методы непосредственно используют определение распределения.
Например, рассмотрим биномиальные случайные числа. Биномиальное случайное число - число головок в бросках монеты с вероятностью головок на любом одиночном броске. Если на интервале генерируются N одинаковых случайных чисел (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 функция фактически использует два прямых метода:
Метод времени ожидания для малых значений
Метод из-за Ahrens и Dieter для больших значений
Методы инверсии основаны на наблюдении, что непрерывные кумулятивные функции распределения (cdfs) равномерно варьируются по интервалу (0,1). Если - равномерное случайное число на (0,1), то использование (U) генерирует случайное число X из непрерывного распределения с указанным 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

Методы инверсии также работают для дискретных распределений. Чтобы сгенерировать случайное число из дискретного распределения с вероятностным массовым вектором = pi, < x2 <..., создайте однородное случайное число u на(0,1) и затем установить xi, < F (xi).
Например, следующая функция реализует метод инверсии для дискретного распределения с вероятностным массовым вектором :
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 , удовлетворяющим (x) для некоторых c и всех x.

Непрерывная приемка-отклонение RNG осуществляется следующим образом:
Выбирает плотность .
Находит константу , так что ) ≤c для всех x.
Генерирует равномерное случайное число .
Генерирует случайное число из .
Если (v), принимает и возвращает v. В противном случае отклоняет v и переходит к шагу 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
Например, функция xe-x2/2 удовлетворяет условиям pdf 0,∞) (неотрицательна и интегрируется в 1). Экспоненциальный pdf со средним = e-x доминирует для c больше, чем около 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.
Методы приемки-отклонения также работают для дискретных распределений. В этом случае целью является генерация случайных чисел из распределения с вероятностной массой = pi, предполагая, что имеется метод генерации случайных чисел из распределения с вероятностной = i) = qi. RNG работает следующим образом:
Выбирает плотность .
Находит константу такую, что для всех .
Генерирует равномерное случайное число .
Генерирует случайное число из .
Если , принимает и возвращает v. В противном случае отклоняет и переходит к шагу 3.