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

时间:2018-09-18 14:54:16

标签: matlab statistics sum 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 

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

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

enter image description here

奖金:

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

2 个答案:

答案 0 :(得分:4)

对于两个值

从本质上讲,这是一个binomial distribution(请参阅Matlab的binornd),仅可缩放和移动,因为基础值由DV给出,而不是0和{{1} }:

1

对于任意数量的值

您拥有的是multinomial distribution(请参阅Matlab的mnrnd):

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;

答案 1 :(得分:2)

通常,自变量的总和具有等于被求变量的pdf的卷积的pdf。当变量是离散的时,可通过Matlab函数conv(很可能调用fft进行快速精确的计算)来方便地计算卷积。

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