我想生成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或任何其他编程语言生成它吗?
发布于 2014-04-16 09:20:28
修改该表,使其具有累积概率和:
[ 0.405, 0.750, 0.875, 0.967, 1.0 ] 从(0.0,1.0)中绘制均匀随机数。搜索表中大于所绘制数字的最小条目;索引是您的值。加到总数上。重复149次。
从270中减去总数,得到最后一个。
发布于 2014-04-16 09:49:12
要使其相加到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);https://stackoverflow.com/questions/23096760
复制相似问题