File Exchange

image thumbnail

Discrete Distribution Random Sampler

version (2.12 KB) by George Papandreou
Fast discrete distribution random sample generator.


Updated 02 Jan 2013

View License

Generate random samples from the discrete distribution.
Uses a property of the Gumbel distribution to avoid for loops for speed.


prob [Q N]
if type=='prob', then
prob(:,n) is the probability vector for the n-th sample, i.e.,
Prob(sample(n)==q) = prob(q,n) / sum(prob(:,n))
prob cannot have negative entries but doesn't need to be normalized.
if type=='energy', then
prob(:,n) is specified in energy (negative log-prob) terms, i.e.,
Prob(sample(n)==q) = exp(-prob(q,n)) / sum(exp(-prob(:,n)))
type (char array)
Can be either 'prob' [default] or 'energy'


sample [1 N]
Random sample from the discrete distribution. Its elements take values
in the set {1,..., Q}.


(1) Generate 1000 IID random samples from the discrete density on 4
variables with symbol probabilities prob = [.4 .2 .1 .3]

Q = 4; N = 1000;
prob = [.4 .2 .1 .3]';
sample = sample_discrete(repmat(prob,[1 N]));
f = zeros(Q,1);
for q=1:Q
f(q) = sum(sample==q)/N;
bar([prob f],'grouped');

(2) Generate 1000 independent random samples from discrete densities on 4
variables with symbol probabilities that differ for each site and are
specified in terms of energies.

Q = 4; N = 1000;
prob = [.4 .2 .1 .3]';
energy = bsxfun(@plus, -log(prob), randn(Q,N));
sample = sample_discrete(energy,'energy');
f = zeros(Q,1);
for q=1:Q
f(q) = sum(sample==q)/N;
bar([prob f],'grouped');

For the underlying method, see the appendix of the paper:
G. Papandreou and A. Yuille, Perturb-and-MAP Random Fields, ICCV-11.

Cite As

George Papandreou (2021). Discrete Distribution Random Sampler (, MATLAB Central File Exchange. Retrieved .

Comments and Ratings (0)

MATLAB Release Compatibility
Created with R2010b
Compatible with any release
Platform Compatibility
Windows macOS Linux

Community Treasure Hunt

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

Start Hunting!