I want to generate a random number with a given probability but I'm not sure how to:
I need a number between 1 and 3
num = ceil(rand*3);
but I need different values to have different probabilities of generating eg.
0.5 chance of 1
0.1 chance of 2
0.4 chance of 3
I'm sure this is straightforward but I can't think of how to do it.
The simple solution is to generate a number with a uniform distribution (using rand
), and manipulate it a bit:
r = rand;
prob = [0.5, 0.1, 0.4];
x = sum(r >= cumsum([0, prob]));
or in a one-liner:
x = sum(rand >= cumsum([0, 0.5, 0.1, 0.4]));
Here r
is a uniformly distributed random number between 0 and 1. To generate an integer number between 1 and 3, the trick is to divide the [0, 1] range into 3 segments, where the length of each segment is proportional to its corresponding probability. In your case, you would have:
The probability of r
falling within any of the segments is proportional to the probabilities you want for each number. sum(r >= cumsum([0, prob]))
is just a fancy way of mapping an integer number to one of the segments.
If you're interested in creating a vector/matrix of random numbers, you can use a loop or arrayfun
:
r = rand(3); % # Any size you want
x = arrayfun(@(z)sum(z >= cumsum([0, prob])), r);
Of course, there's also a vectorized solution, I'm just too lazy to write it.