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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  2. Находит константу таким образом это для всех.

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

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

  5. Если, принимает и возвращается. В противном случае отклонения и переходят к шагу 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')

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

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

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

  2. Находит константу таким образом это для всех.

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

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

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

Похожие темы