Custom Uniform Random Distribution

matlabkid602 (view profile)

on 23 Feb 2018
Latest activity Answered by Roger Stafford

Roger Stafford (view profile)

on 24 Feb 2018
Say I have a uniform random distribution in matlab using the rand() function.
How can I change the distribution for a given function such as 1/sqrt(x), so the distribution follows this curve?
I've tried to reject values but had no luck.

John BG

John BG (view profile)

on 23 Feb 2018
Hi Matlabkid602
1.
the main constraint is that whatever probability density function you choose, it must have area 1, integrating from -Inf to +Inf.
2.
Since you choose 1/sqrt(x), you have to truncate, let's say with a continuous interval [a b], a<b.
The new pdf should have the shape
pdf2(x<a)=0
pdf2(x>b)=0
pfg2(0<x<b)=1/sqrt(x)
3. make sure that for instance 0<b<a, otherwise and undesired discontinuity will be included in the function intended to behave as pdf and it will not work.
4.
The values of the interval [a b] are related in the following way:
sqrt(b)-sqrt(a)=0.5

on 23 Feb 2018

Roger Stafford (view profile)

on 24 Feb 2018

If you want to obtain a density distribution proportional to 1/sqrt(x) for x in some finite interval [a,b], you can proceed as follows. The cumulative probability function must be:
cdf(x) = (sqrt(x)-sqrt(a))/(sqrt(b)-sqrt(a))
which you get by integrating 1/sqrt(x) from a to x and adjusting the proportionality constant to get a cdf(b)=1 for the entire interval from a to b.
To generate this using rand, set the above cdf(x) to r = rand and solve for x:
r = rand;
%Solve for x in (sqrt(x)-sqrt(a))/(sqrt(b)-sqrt(a)) = r:
x = (sqrt(a)+(sqrt(b)-sqrt(a))*r).^2;
This illustrates how one would proceed to use rand for generating any given probability density function. It depends on being able to solve for x in an equation cdf(x) = r.