# Generating random numbers with a different probabilities

9 views (last 30 days)
Omar N on 1 Dec 2021
Answered: Steven Lord on 1 Dec 2021
If I want to generate random numbers between 0 and 150, however i want the probability of having numbers between 0 and 50 to be higher, how can i do it?
##### 2 CommentsShowHide 1 older comment
Omar N on 1 Dec 2021
Thank you for your response, I should have illustrated more, but I am new here and I still face difficulties in writing my questions in a proper way.
I want to generate integers between 0 and 150. However, as I’ve mentioned I want to increase and control the probability of having numbers less than 50, If you can recommend one distribution or command that helps me in achieving my goal I would be thankful.

Yusuf Suer Erdem on 1 Dec 2021
Hi there. These codes below are completely original and made by me for you. Each time you need to enter a probability value to the system. When the probability is closer to 1, the system gives more digits from 0-50 range. I hope it works for you. Good luck.
clc; clear; close all;
if choice==1
r = randi([0 50],1,125);
k = randi([50 150],1,25);
elseif choice==2
r = randi([0 50],1,100);
k = randi([50 150],1,50);
else
r = randi([0 50],1,75);
k = randi([50 150],1,75);
end
l=[r k];
##### 2 CommentsShowHide 1 older comment
Yusuf Suer Erdem on 1 Dec 2021
I never experienced that.

Alan Stevens on 1 Dec 2021
Assuming there are just two levels of probability, and that the numbers are real, not just integers, you could try:
p50 = 0.75; % probability of number less than 50
N = 10^5; % number of random numbers required
u = rand(N,1); % uniform random numbers
r(u<=p50) = u(u<=p50)*50; % random numbers less than 50
r(u>p50) = u(u>p50)*100 + 50; % random numbers between 50 and 150
Omar N on 1 Dec 2021
Thank you this was useful, however is there any specific distribution that i can use to know the probability of having certain number.
In other words, if i want to know the probability of getting 1 or 2 or 150, is there any distribution that I can use?

Steven Lord on 1 Dec 2021
If you know the probabilities you want each number to have you could use discretize. For instance if I want to generate numbers between 1 and 10 with the odd numbers being twice as likely:
P = repmat([2 1], 1, 5)
P = 1×10
2 1 2 1 2 1 2 1 2 1
cumulativeP = [0 cumsum(P)./sum(P)]
cumulativeP = 1×11
0 0.1333 0.2000 0.3333 0.4000 0.5333 0.6000 0.7333 0.8000 0.9333 1.0000
r = rand(1, 1e5); % Random numbers in range (0, 1)
d = discretize(r, cumulativeP); % Bin the random numbers in r using the bins in cumulativeP
h = histogram(d, (1:11)-0.5, 'Normalization', 'probability'); % Show the results
xticks(1:10)
The bars for 1, 3, 5, 7, and 9 are about twice as tall as the bins for 2, 4, 6, 8, and 10 as expected.
shouldBeCloseToP = h.Values./h.Values(end)
shouldBeCloseToP = 1×10
1.9883 0.9840 2.0051 1.0124 1.9748 1.0204 1.9954 0.9886 2.0033 1.0000