"Precise" random variables from a distribution

3 views (last 30 days)
Dear community,
I have an interval from 0 to 1 with a step 0.01 (also can be considered as from 0 to 100). This 101 values unifromly distruted on this interval.
I am trying to randomly draw two values from this interval and expect them to look like 0.15 and 0.25 or 0.9 and 0.56, etc.
I use the following code:
b = 1;
N = 0:0.01:1;
for i = 0:0.01:1
p1 = rand;
p2 = rand;
end
This gives me two random values between 0 and 1 but they have a smaller step, for instance, it returns p1 = 0.0538 and p2 = 0.7781.
Any help will be highly appreciated!

Accepted Answer

Steven Lord
Steven Lord on 8 Aug 2022
Since 0.01 cannot be exactly represented in double precision, your values may not be exactly multiples of one-hundredth. But if you want to draw elements from a specific set of values, you can use randperm (without replacement) or randi (with replacement) to generate indices into that set.
S = [0, 5, 42, -999];
withoutReplacement = randperm(numel(S), 3) % Ask for 3 of the elements of S
withoutReplacement = 1×3
3 2 1
withReplacement = randi(numel(S), [1 3])
withReplacement = 1×3
3 1 3
S(withoutReplacement)
ans = 1×3
42 5 0
S(withReplacement)
ans = 1×3
42 0 42
  11 Comments
Yuriy
Yuriy on 12 Aug 2022
so far I could do like this, but I am not sure it is correct.
a = 0.2;
v = 1;
p_bar = v;
p_low = 0;
p_hat = 0.3;
pd1 = makedist('Uniform','lower',p_low,'upper',p_bar);
pd2 = makedist('Uniform','lower',p_low,'upper',p_bar);
p_1 = (p_low:0.01:p_bar);
p_2 = (p_low:0.01:p_bar);
pdf1 = pdf(pd1,p_1);
cdf1 = cdf(pd1,p_1);
pdf2 = pdf(pd2,p_2);
cdf2 = cdf(pd2,p_2);
f_1 = @(p_1) p_1 * (a + 1-a/2) + p_2 * (a + 1-a/2);
y_1=f_1(p_1);
f_2 = @(p_1) p_1 * (a + 1-a/2) + p_bar*(1-a)/2;
y_2=f_2(p_1);
plot(p_1,y_1,p_2,y_2)

Sign in to comment.

More Answers (0)

Products


Release

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by