вы можете сложить два равномерных распределения, графики распределения свернуты, и вы получите треугольное распределение.
простой для понимания пример: бросание двух кубиков, каждое действие имеет равномерное распределение, в результате чего получается числос 1-6, комбинированное действие имеет треугольное распределение, в результате чего получается число 2-12
edit: минимальный рабочий пример:
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);