首页 > 解决方案 > 如何生成表示离散均匀分布之和的数字

问题描述

步骤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 

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

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

在此处输入图像描述

奖金:

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

标签: matlabstatisticssumuniform-distribution

解决方案


对于两个值

这本质上是一个二项式分布(参见 Matlab 的binornd),只是缩放和移动,因为基础值是由给出的,DV而不是0and 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 的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);

推荐阅读