Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何生成表示离散均匀分布和的数字_Matlab_Statistics_Sum_Uniform Distribution - Fatal编程技术网

Matlab 如何生成表示离散均匀分布和的数字

Matlab 如何生成表示离散均匀分布和的数字,matlab,statistics,sum,uniform-distribution,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 distribu

第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,…]

第二步:

现在我想生成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

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

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

奖金:

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

这本质上是一个(参见Matlab的),只是缩放和移动,因为基本值由
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;
对于任意数量的值 您拥有的是a(参见Matlab):


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


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

清晰、简单,比我的for-loop解决方案快得多。这就是我一直在寻找的答案。当你通过卷积得到概率函数时,你可以用这个(离散的)分布生成随机数。概率函数作为可选的第四个输入参数传递
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);