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

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

Random number generators (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 функционируйте на самом деле использует два прямых метода:

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

  • Метод из-за Аренса и Дитера для больших значений λ

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

Методы инверсии основаны на наблюдении, что непрерывные кумулятивные функции распределения (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 \forall 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.

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

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

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

  2. Находит константу c таким образом, что pi/qic \forall i.

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

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

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

Похожие темы