2014-04-16 34 views
1

我想和值作为正整数(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 

基本上,所有的随机数的总和,以产生150张随机数的限制固定,概率是固定的,随机数应该取值大于0.

有谁知道我该如何在python/MATLAB/C或任何其他编程语言中生成它。

+1

你有矛盾的要求。如果150个数字有固定的总和,至少有一个数字不是独立随机的。您可以根据您的分布绘制149,并根据当前和目标总和计算最后一个。它会起作用吗? – user58697

+0

是的,你是对的。这很好,至少其中一个不会是随机的。 – user3388706

+0

这些概率有多灵活?例如0.405 * 150 = 60.75因此结果中必须有61个?更糟糕的是0.405 * 150 * 1 + 0.345 * 150 * 2 + 0.125 * 150 * 3 + 0.092 * 150 * 4 = 275.7,这大于最大总和270 ... – srgerg

回答

1

修改表,使得其具有概率的累加和:

[ 0.405, 0.750, 0.875, 0.967, 1.0 ] 

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

从270减去总数得到最后一个。

+0

虽然这种解决方案是可行的,但事实上,如果约束是合理的,它将永远不会产生包含大于5的数字的解决方案,这在问题中明确允许。 – srgerg

+0

我已经完成了这项工作,并且在每次迭代中都会计算总和,同时根据您所讲的方法分配一个随机数{1,2,3,4,5,....}。总和有时在143位置,有时在141位置。所以,现在没有什么可以分配的,这意味着我需要从先前的值中减去一些东西,以便分配7或9位的左侧至少1个。 – user3388706

+0

想想看,最后一个数字可能会大于五个 - 但只有最后一个数字。然而,更大的问题是,问题中指定概率分布的150个数加起来超过270 ... – srgerg

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,天道酬勤),或者可能高达intmax

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

如果你没有randsample,可以使样本如下s,

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