我想生成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 :(得分:1)
修改表格,使其具有累积概率总和:
[ 0.405, 0.750, 0.875, 0.967, 1.0 ]
从(0.0,1.0)中随机绘制一个均匀的。在表格中搜索大于绘制数字的最小条目;指数是你的价值。加总。重复149次。
从270减去总数以得到最后一个。
答案 1 :(得分:1)
要使其加起来为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);