Как сгенерировать число, представляющее сумму дискретного равномерного распределения - PullRequest
0 голосов
/ 18 сентября 2018

Шаг 1:

Допустим, я хочу сгенерировать дискретные однородные случайные числа, принимающие значение -1 или 1. Поэтому, другими словами, я хочу сгенерировать числа, имеющие следующее распределение:

P(X = -1) = 0.5
P(X =  1) = 0.5

Чтобы создать массив из 100 этих чисел, я могу написать следующий код:

n   = 100
DV  = [-1,1];          % Discrete value
RI  = unidrnd(2,n,1);  % Random uniform index
DUD = DV(RI);          % Discrete uniform distribution

Мой массив DUD выглядит следующим образом: [-1,1,1,1,-1,-1,1,-1,...]

Шаг 2:

Теперь я хотел бы сгенерировать 10 чисел, равных sum(DUD), поэтому 10 чисел имеют распределение, соответствующее сумме 100 чисел после дискретного равномерного распределения.

Конечно, я могу сделать это:

for ii = 1:10
    n   = 100;
    DV  = [-1,1];          % Discrete value
    RI  = unidrnd(2,n,1);  % Random index
    DUD = DV(RI);          % Discrete uniform distribution
    SDUD(ii) = sum(DUD);
end

С помощью

SDUD =

   2   2  -6  -2  -4   2   4   4   0   2 

Есть ли математический трюк / математический трюк для этого? без использования дляloop.

Гистограмма SDUD (с 10000 значениями и n = 100) выглядит следующим образом:

enter image description here

Бонус:

Будет здорово, если исходные дискретные значения могут быть изменены.Таким образом, вместо [-1,1] дискретное значение может быть, например, [0,1,2], каждое с вхождением p = 1 / number_of_discrete_value, поэтому 1/3 в этом примере.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

В общем случае сумма независимых переменных имеет pdf, равный свертке pdf слагаемых переменных.Когда переменные являются дискретными, свертка очень удобно вычисляется с помощью функции Matlab conv (которая, вероятно, вызывает fft для быстрого и точного вычисления).

Когда PDF-файлы однородны, то результатом свертки является биномиальный или полиномиальный PDF.Но материал свертки применим и к неоднородным PDF-файлам.

0 голосов
/ 18 сентября 2018

Для двух значений

По сути это биномиальное распределение (см. Matlab's binornd), только масштабированное и смещенное, поскольку базовые значения задаются как DV вместо того, чтобы быть 0 и 1:

n = 100;
DV = [-1 1];
p = .5; % probability of DV(2)
M = 10;
SDUD = (DV(2)-DV(1))*binornd(n, p, M, 1)+DV(1)*n;

Для произвольного числа значений

У вас есть полиномиальное распределение (см. Matlab's mnrnd):

n = 100;
DV = [-2 -1 0 1 2];
p = [.1 .2 .3 .3 .1]; % probability of each value. Sum 1, same size as DV
M = 10;
SDUD = sum(bsxfun(@times, DV, mnrnd(n, p, M)), 2);
...