如果您不使用统计工具箱(否则请参阅Stewie's answer)导出经验 cdf,然后使用inverse sampling:
% Numbers of draws
N = 1e3;
% Sample a uniform in (0, 1)
x = rand(N,1);
% Empirical cdf
ecdf = cumsum([0, v]);
% Inverse sampling/binning
[counts, bin] = histc(x,ecdf);
其中bin 直接映射到v。所以,如果你有一组通用值y 和概率v,你应该采取:
out = y(bin);
注意,随着抽奖次数N 的增加,我们会得到更好的概率近似值:
counts(end) = []; % Discard last bucket x==1
counts./sum(counts)
函数可以是:
function [x, counts] = mysample(prob, val, N)
if nargin < 2 || isempty(val), val = 1:numel(prob); end
if nargin < 3 || isempty(N), N = 1; end
[counts, bin] = histc(rand(N,1), cumsum([0, prob(:)']));
x = val(bin);
end