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

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

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

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

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

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

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

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

Например, рассмотрите биномиальные случайные числа. Биномиальное случайное число является количеством голов в 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)

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 заданного экспоненциала путем масштабирования PDF к области гистограммы раньше отображало распределение:

numbins = 50;
h = histogram(X,numbins);
hold on
histarea = h.BinWidth*sum(h.Values);
x = h.BinEdges(1):0.001:h.BinEdges(end);
y = exppdf(x,mu);
plot(x,histarea*y,'r','LineWidth',2)
hold off

Методы инверсии также работают на дискретные распределения. Сгенерировать случайное число 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 vector
X = discreteinvrnd(p,1e4,1);
h = histogram(X,length(p));

bar(1:length(p),h.Values)

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

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

Методы приемного отклонения начинаются с универсальных случайных чисел, но требуют дополнительного генератора случайных чисел. Если ваша цель состоит в том, чтобы сгенерировать случайное число от непрерывного распределения с 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')

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.

Похожие темы