任意编程语言中具有约束的随机数生成



我想生成150个随机数,其值为正整数(1,2,3,4,5.....),使所有随机数之和为270,

Prob[1] = 0.405
Prob[2] = 0.345
Prob[3] = 0.125
Prob[4] = 0.092
Prob[>=5] = 0.033

基本上,所有随机数的和是固定的,概率是固定的并且随机数应该取大于0的值。

有人知道我如何用python/MATLAB/C或任何其他编程语言生成它吗。

修改表格,使其具有累积的概率总和:

[ 0.405, 0.750, 0.875, 0.967, 1.0 ] 

从(0.0,1.0)中绘制一个均匀的随机数。在表中搜索大于所绘制数字的最小条目;指数就是你的价值。添加到总数中。重复149次。

用270减去total得到最后一个。

要使其相加到270,可能需要从指定的分布中重复生成150个样本的集合,直到样本相加到270。然而,在这种情况下,值的分布将不会非常接近期望的分布。

在MATLAB中,最简单的方法是使用randsample,它是信号处理工具箱的一部分。例如,

randsample(1:5, 150, true, [0.405 0.345 0.125 0.092 0.033])

运行它,直到输出总和为270:

rsum = 0;
while rsum~=270,
    rs = randsample(1:5, 150, true, [0.405 0.345 0.125 0.092 0.033]);
    rsum = sum(rs);
end

对于大于5的值,您可以将样本==5替换为从[5],Inf)上的均匀分布中获得的新数字,或者最多intmax:

fives = rs==5;
rs(fives) = randi(intmax-5+1,nnz(fives)+100,1)+5-1

如果您没有randsample,您可以按照以下方式制作样品,

N = 150;
vals = 1:5;
p = [0.405 0.345 0.125 0.092 0.033];
cdf = [0 cumsum(p(:).'/sum(p))]; cdf(end)=1;
[~, isamps] = histc(rand(N,1),cdf);
rs = vals(isamps);

最新更新