How to pick a value according to its probability
    28 views (last 30 days)
  
       Show older comments
    
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 Comments
Accepted Answer
  Sean de Wolski
      
      
 on 7 Dec 2011
        f = X(find(rand<cumsum(P),1,'first'))
1 Comment
  Walter Roberson
      
      
 on 7 Dec 2011
				The answers in the other thread took care in case cumsum(P) < 1 as can happen due to round-off error.
More Answers (3)
  Jonathan
      
 on 3 Sep 2018
        
      Edited: Jonathan
      
 on 3 Sep 2018
  
      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 Comments
  Steven Lord
    
      
 on 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.
0 Comments
  Mendi
 on 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
0 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!










