Generating random numbers with weighted distribution in Matlab

De openkb
Aller à : Navigation, rechercher

Sommaire

Questions

I know how to generate random numbers in a certain range in Matlab. What i am trying to do now is generate random numbers in a range where there is more chance of getting certain ones.

For example: how could i use Matlab to generate random numbers between 0 and 2, where 50% of them will be less than 0.5?

To get numbers between 0 and 2 I would use (2-0)*rand+0. How can i do this but get a certain percentage of the numbers generated to be less than 0.5? Is there a way to do this using the rand function?

Answers

Here is a suggestion:

N = 10; % how many random numbers to generate
bounds = [0 0.5 1 2]; % define the ranges
prob = cumsum([0.5 0.3 0.2]); % define the probabilities
% pick a random range with probability from  prob :
s = size(bounds,2)-cumsum(bsxfun(@lt,rand(N,1),prob),2);
% pick a random number in this range:
b = rand(1,N).*(bounds(s(:,end)+1)-bounds(s(:,end)))+bounds(s(:,end))

Here we have a probability of prob(k) to draw a number between bounds(k) to bounds(k+1). Basically we first draw a range with defined probability, and then draw another number from the range. So we are interested only in b, but need s on the way (mainly for creating a lot of numbers in a vectorized manner).

so we get:

b =
  Columns 1 through 5
       0.5297      0.15791      0.88636      0.34822     0.062666
  Columns 6 through 10
     0.065076      0.54618    0.0039101      0.21155      0.82779

Or, for N = 100000 we can draw:

https://i.stack.imgur.com/pkFgY.png https://i.stack.imgur.com/pkFgY.png

so we can see how the values are distributed between the 3 ranges in bounds.

Source

License : cc by-sa 3.0

http://stackoverflow.com/questions/40294890/generating-random-numbers-with-weighted-distribution-in-matlab

Related

Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Outils