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

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

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

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

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

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

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

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

Для примера рассмотрим биномиальные случайные числа. Биномиальное случайное число - это количество глав в N tosses монеты с вероятностью 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.

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

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

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

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

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

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

Методы инверсии основаны на наблюдении, что непрерывные совокупные функции распределения (cdfs) равномерно варьируются по интервалу (0,1). Если u является равномерным случайным числом на (0,1), затем использование X=F-1(U) генерирует случайное число X из непрерывного распределения с заданным cdf F.

Например, следующий код генерирует случайные числа из определенного Экспоненциального Распределения с помощью обратного 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. Если cuf(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.

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

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

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

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

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

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

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

Похожие темы