How to pick a value according to its probability

Hi,
Let's say
P = [0.1 0.3 0.4 0.2]
X = [1 2 5 9]
where P(n) is the probability to select the X(n) element. I wish to make a function that select a "random" element of X according to its probability, like
f = myfun(P,X)
>> f = 2 (occurs around 30%)
thx a lot

4 Kommentare

Oleg Komarov
Oleg Komarov am 7 Dez. 2011
Bearbeitet: Walter Roberson am 3 Nov. 2016
This is a double post. See my comment on Andrei's answer: http://www.mathworks.com/matlabcentral/answers/23319-easy-question-with-probability
Nikolas Spiliopoulos
Nikolas Spiliopoulos am 3 Nov. 2016
Bearbeitet: Nikolas Spiliopoulos am 3 Nov. 2016
what if we have two numbers? Lets say 50% probability to get a=0.05 and b= -0.05
Sorry I am a very beginner in MATLAB
thanks in advance
Nikolas
AB = [a,b];
AB( randi([1 2]) )
how to select an element with least probablility

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

Sean de Wolski
Sean de Wolski am 7 Dez. 2011

2 Stimmen

f = X(find(rand<cumsum(P),1,'first'))

1 Kommentar

The answers in the other thread took care in case cumsum(P) < 1 as can happen due to round-off error.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (3)

Jonathan
Jonathan am 3 Sep. 2018
Bearbeitet: Jonathan am 3 Sep. 2018

8 Stimmen

The accepted answer is not doing any sanity check, and is sensitive to rounding errors. You should use randsample instead.
To sample n points from X, with replacement, and probabilities P:
randsample( X, n, true, P )
This can also be used with a custom RandStream (see documentation). Be aware that this function does NOT check for negative values in P; check manually if needed.

4 Kommentare

That was what I was looking for. Thank you !
how to select an element with least probablility
searched a lot for this kind of function
Real User
Real User am 28 Apr. 2023
randsample() seems to require Statistics and Machine Learning Toolbox

Melden Sie sich an, um zu kommentieren.

Steven Lord
Steven Lord am 16 Apr. 2020
You can use discretize (which didn't exist when this question was asked originally) to do this. Generate uniform random numbers, bin them using bins whose widths are given by P, and for each bin return the corresponding element of X.
P = [0.1 0.3 0.4 0.2];
X = [1 2 5 9];
values = discretize(rand(1, 1e4), cumsum([0 P]), X);
histogram(values, 'Normalization', 'probability')
The probabilities shown in the histogram should agree pretty closely with the values in P.
Mendi
Mendi am 9 Jul. 2021
The fastest one (100ns-200ns):
function [idx] = get_random_choice(p)
% Random choice with probability
% Example: get_random_choice([0.2,0.7,0.1])
N=length(p); idx=1; cump=0;
r=rand;
while(idx<N)
cump=cump+p(idx);
if(cump>r),break,else,idx=idx+1;end
end
end

Community Treasure Hunt

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

Start Hunting!

Translated by