Step 1:
Let's say that I want to generate discrete uniform random numbers taking the value -1 or 1. So in other words I want to generate numbers having the following distribution:
P(X = -1) = 0.5
P(X = 1) = 0.5
To generate an array of 100 of those numbers I can write this code:
n = 100
DV = [-1,1]; % Discrete value
RI = unidrnd(2,n,1); % Random uniform index
DUD = DV(RI); % Discrete uniform distribution
My DUD array looks like: [-1,1,1,1,-1,-1,1,-1,...]
Step 2:
Now I would like to generate 10 numbers equal to sum(DUD)
, so 10 numbers having a distribution corresponding to the sum of 100 numbers following a discrete uniform distribution.
Of course I can do that:
for ii = 1:10
n = 100;
DV = [-1,1]; % Discrete value
RI = unidrnd(2,n,1); % Random index
DUD = DV(RI); % Discrete uniform distribution
SDUD(ii) = sum(DUD);
end
With
SDUD =
2 2 -6 -2 -4 2 4 4 0 2
Is there a mathematical/matlab trick to do that ? without using a for loop.
The histogram of SDUD (with 10000 values and n=100) looks like this:
Bonus:
It will be great if the original discrete values could be modified. So instead of [-1,1] the discrete value could be, for example, [0,1,2], each with an occurence p = 1/number_of_discrete_value, so 1/3 in this example.
That's essentially a binomial distribution (see Matlab's binornd
), only scaled and shifted because the underlying values are given by DV
instead of being 0
and 1
:
n = 100;
DV = [-1 1];
p = .5; % probability of DV(2)
M = 10;
SDUD = (DV(2)-DV(1))*binornd(n, p, M, 1)+DV(1)*n;
What you have is a multinomial distribution (see Matlab's mnrnd
):
n = 100;
DV = [-2 -1 0 1 2];
p = [.1 .2 .3 .3 .1]; % probability of each value. Sum 1, same size as DV
M = 10;
SDUD = sum(bsxfun(@times, DV, mnrnd(n, p, M)), 2);