2014-04-16 68 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);