如何生成代表离散均匀分布之和的数字

How to generate a number representing the sum of a discrete uniform distribution

第 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 

是否有 mathematical/matlab 技巧可以做到这一点? 无需使用 for 循环。

SDUD 的直方图(具有 10000 个值且 n=100)如下所示:

奖金:

要是能修改原来的离散值就好了。因此,离散值可以不是 [-1,1],例如 [0,1,2],每个值都出现 p = 1/number_of_discrete_value,因此在此示例中为 1/3。

对于两个值

这本质上是一个 binomial distribution (see Matlab's binornd),只是缩放和移动,因为基础值由 DV 给出,而不是 01:

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;

对于任意数量的值

你有一个 multinomial distribution (see 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);

一般来说,自变量之和的 pdf 等于被加变量的 pdf 的卷积。当变量是离散的时,通过 Matlab 函数 conv(可能调用 fft 进行快速、精确的计算)可以非常方便地计算卷积。

当 pdf 均匀时,卷积的结果是二项式或多项式 pdf。但是卷积的东西也适用于非均匀的 pdf。