matlab - 如何生成表示离散均匀分布之和的数字
问题描述
步骤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。
解决方案
对于两个值
这本质上是一个二项式分布(参见 Matlab 的binornd
),只是缩放和移动,因为基础值是由给出的,DV
而不是0
and 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;
对于任意数量的值
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);
推荐阅读
- php - get_term() 返回先前帖子的值而不是当前帖子
- html - 我正在尝试将网站中的数据抓取到 R
- c# - C# Lambda 表达式 (LINQ) 生成的成员是基类而不是子类的一部分
- javascript - 如何在 .reduce 函数中返回数组而不是数组对象?
- reactjs - 在 vscode 中的 redux reducer 中出现 Typescript 注释错误,即使我没有在 Typescript 中编写任何内容
- django - Django-taggit 迁移在 AlterUniqueTogether 失败
- python - Scikit-image Regionprops 方向值
- arrays - 通过将一个数组中的记录与 Perl 中另一个数组中的唯一名称列表匹配来创建单个文件
- json - 有问题的解析 JSON 对象格式。如何在 Swift 5 中解码下面的 JSON 对象?
- angular - 有没有办法在每个 mat-step 中延迟加载组件?