在任何编程语言中使用约束生成随机数

时间:2014-04-16 00:14:38

标签: python matlab math random

我想生成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或任何其他编程语言中生成它。

2 个答案:

答案 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);