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.