我尝试在Matlab中生成三角概率分布,但没有成功。我使用了http://en.wikipedia.org/wiki/Triangular_distribution中的公式.
n = 10000000;
a = 0.2;
b = 0.7;
c = 0.5;
u = sqrt(rand(n, 1));
x = zeros(n, 1);
for i = 1:n
U = u(i);
if U < (c-a)/(b-a)
X = a + sqrt(U*(b-a)*(c-a));
else
X = b - sqrt((1-U)*(b-a)*(b-c));
end
x(i) = X;
end
hist(x, 100);
直方图如下所示:
对我来说看起来不太像三角形。有什么问题?我是否滥用了rand(n)
?
最佳答案
您可以将两个均匀分布相加,分布图进行卷积,得到一个三角形分布。
简单易懂的例子:掷两个骰子,每个 Action 均匀分布,得出1-6的数字,组合 Action 呈三角形分布,得出2-12的数字
编辑:最小工作示例:
a=randint(10000,1,10);
b=randint(10000,1,10);
c=a+b;
hist(c,max(c)-min(c)+1)
edit2:再次查看你的脚本。它正在工作,但您犯了一个错误:
u = sqrt(rand(n, 1));
应该是
u = rand(n, 1);
edit3:优化代码
n = 10000000;
a = 0.2;
b = 0.7;
c = 0.5;
u = rand(n, 1);
x = zeros(n, 1);
idx = find(u < (c-a)/(b-a));
x(idx) = a + sqrt(u(idx)*(b-a)*(c-a));
idx =setdiff(1:n,idx);
x(idx) = b - sqrt((1-u(idx))*(b-a)*(b-c));
hist(x, 100);
罢工><罢工>罢工>
关于matlab - 在 Matlab 中生成三角分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9241904/