exponenta event banner

Генерация псевдослучайных чисел

Псевдослучайные числа генерируются детерминированными алгоритмами. Они являются «случайными» в том смысле, что в среднем они проходят статистические тесты относительно их распределения и корреляции. Они отличаются от истинных случайных чисел тем, что генерируются алгоритмом, а не действительно случайным процессом.

Генераторы случайных чисел (RNG), подобные таковым в MATLAB ®, являются алгоритмами для генерации псевдослучайных чисел с заданным распределением.

Дополнительные сведения о графическом интерфейсе пользователя для генерации случайных чисел из поддерживаемых распределений см. в разделе Обзор пользовательского интерфейса генерации случайных чисел.

Общие методы генерации псевдослучайных чисел

Методы генерации псевдослучайных чисел обычно начинаются с однородных случайных чисел, таких как MATLAB rand функция производит. Методы, описанные в этом разделе, подробно описывают, как производить случайные числа из других распределений.

Прямые методы

Прямые методы непосредственно используют определение распределения.

Например, рассмотрим биномиальные случайные числа. Биномиальное случайное число - число головок в N бросках монеты с вероятностью p головок на любом одиночном броске. Если на интервале генерируются N одинаковых случайных чисел (0,1) и подсчитать число меньше p, то счет является биномиальным случайным числом с параметрами N и p.

Эта функция является простой реализацией биномиального 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)

Figure contains an axes. The axes contains an object of type histogram.

binornd функция использует модифицированный прямой метод, основанный на определении биномиальной случайной величины как суммы случайных величин Бернулли.

Можно легко преобразовать предыдущий метод в генератор случайных чисел для распределения Пуассона с параметром λ. Распределение Пуассона является ограничивающим случаем биномиального распределения, когда N приближается к бесконечности, p приближается к нулю, а Np удерживается фиксированным при λ. Чтобы создать случайные числа Пуассона, создайте версию предыдущего генератора, который вводит λ, а не N и p, и внутренне устанавливает N в некоторое большое число и p в λ/N.

poissrnd функция фактически использует два прямых метода:

  • Метод времени ожидания для малых значений λ

  • Метод из-за Ahrens и Dieter для больших значений λ

Методы инверсии

Методы инверсии основаны на наблюдении, что непрерывные кумулятивные функции распределения (cdfs) равномерно варьируются по интервалу (0,1). Если u - равномерное случайное число на (0,1), то использование X = F-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

Figure contains an axes. The axes contains 2 objects of type histogram, line.

Методы инверсии также работают для дискретных распределений. Чтобы сгенерировать случайное число X из дискретного распределения с вероятностным массовым вектором P (X = xi) = pi, где x0 < x1 < x2 <..., создайте однородное случайное число u на(0,1) и затем установить X = xi, если F (xi-1) < u < F (xi).

Например, следующая функция реализует метод инверсии для дискретного распределения с вероятностным массовым вектором p:

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')

Figure contains an axes. The axes contains an object of type categoricalhistogram.

Методы приемки-отклонения

Функциональная форма некоторых распределений затрудняет или отнимает много времени на генерацию случайных чисел с использованием методов прямой или инверсии. В этих случаях альтернативой являются методы приемки-отклонения.

Методы принятия-отклонения начинаются с однородных случайных чисел, но требуют дополнительного генератора случайных чисел. Если ваша цель состоит в том, чтобы сгенерировать случайное число из непрерывного распределения с pdf f, методы принятия-отклонения сначала генерируют случайное число из непрерывного распределения с pdf g, удовлетворяющим f (x) ≤cg (x) для некоторых c и всех x.

Непрерывная приемка-отклонение RNG осуществляется следующим образом:

  1. Выбирает плотность g.

  2. Находит константу c, так что f (x )/g (x) ≤c для всех x.

  3. Генерирует равномерное случайное число u.

  4. Генерирует случайное число v из g.

  5. Если cu≤f (v )/g (v), принимает и возвращает v. В противном случае отклоняет v и переходит к шагу 3.

Для эффективности необходим «дешевый» способ генерации случайных чисел из g, а скаляр c должен быть небольшим. Ожидаемое число итераций для получения одного случайного числа равно c.

Следующая функция реализует метод принятия-отклонения для генерации случайных чисел из pdf f, заданного f, g, RNG grnd для g и константы c:

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

Например, функция f (x) = xe-x2/2 удовлетворяет условиям pdf на [0,∞) (неотрицательна и интегрируется в 1). Экспоненциальный pdf со средним значением 1, f (x) = e-x доминирует над g для c больше, чем около 2,2. Таким образом, можно использоватьrand и exprnd для генерации случайных чисел из f:

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 f фактически является релейным распределением с параметром формы 1. В этом примере сравнивается распределение случайных чисел, сгенерированных методом приемки-отклонения, с распределениями, сгенерированными методом raylrnd:

Y = raylrnd(1,1e4,1); 
histogram(X)
hold on
histogram(Y)
legend('A-R RNG','Rayleigh RNG')

Figure contains an axes. The axes contains 2 objects of type histogram. These objects represent A-R RNG, Rayleigh RNG.

raylrnd функция использует метод преобразования, выражающий случайную переменную Рэлея в терминах случайной величины хи-квадрат, которая вычисляется с помощью randn.

Методы приемки-отклонения также работают для дискретных распределений. В этом случае целью является генерация случайных чисел из распределения с вероятностной массой Pp (X = i) = pi, предполагая, что имеется метод генерации случайных чисел из распределения с вероятностной массой Pq (X = i) = qi. RNG работает следующим образом:

  1. Выбирает плотность Pq.

  2. Находит константу c такую, что pi/qi≤c для всех i.

  3. Генерирует равномерное случайное число u.

  4. Генерирует случайное число v из Pq.

  5. Если cu≤pv/qv, принимает и возвращает v. В противном случае отклоняет v и переходит к шагу 3.

Связанные темы