如何生成代表离散均匀分布之和的数字
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
给出,而不是 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;
对于任意数量的值
你有一个 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。
第 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
给出,而不是 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;
对于任意数量的值
你有一个 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。