2010-08-19 68 views
1

我希望我能解釋得很好,如果我不行,我會再試一次。根據分佈生成一組隨機整數列表

我想要生成一個5個隨機數組成的數組,這些數字加起來最多爲10個,但其分配的間隔爲[0,2n/m]。

我正在使用numpy。

到目前爲止我看起來像這樣的代碼:

import numpy as np 

n=10 
m=5 
#interval that numbers are generated on 
randNumbers= np.random.uniform(0,np.divide(np.multiply(2.0,n),fronts),fronts) 
#Here I normalize the random numbers 
normNumbers = np.divide(randNumbers,np.sum(randNumbers)) 
#Next I multiply the normalized numbers by n 
newList = np.multiply(normNumbers,n) 
#Round the numbers two whole numbers 
finalList = np.around(newList) 

這適用於大多數情況,但四捨五入關閉時,它會加起來9或11,而不是10有沒有如何做我想做的事情,而不必擔心舍入錯誤,或者可能是解決它們的一種方法?如果你希望我能更清楚一點,因爲在談論時我無法解釋我想要做什麼。

回答

1

這產生所有總和爲10的可能的組合,並選擇一個隨機

from itertools import product 
from random import choice 
n=10 
m=5 
finalList = choice([x for x in product(*[range(2*n/m+1)]*m) if sum(x) == 10]) 

可能有一個更有效的方式,但是這將結果

讓我們來看看如何之間相當選擇工作,當n = 10且m = 5

2*n/m+1 = 5,所以表達式變爲

finalList = choice([x for x in product(*[range(5)]*5) if sum(x) == 10]) 

`* [range(5)] * 5正在使用參數解包。這相當於

finalList = choice([x for x in product(range(5),range(5),range(5),range(5),range(5)) if sum(x) == 10]) 

product()給出的參數,在這種情況下有5種** 5種元素的笛卡爾積,但後來我們篩選出那些不添加到10,這讓列表381的值

choice()用於從結果列表中選擇一個隨機值

+0

這工作,謝謝。 – elais 2010-08-19 04:43:37

+0

它的工作,但你能解釋你的最後一行是怎麼回事?只是讓我知道我在用什麼?我對python非常陌生。 – elais 2010-08-21 04:07:35

1

只需使用上述方法生成四個數字,然後從10中減去四個數字的總和即可選擇最後一個數字。

+0

我認爲這是正確的。你不能「隨機」選擇所有的五個數字,並期望他們總結到一定的數值​​。 – erickson 2010-08-19 04:17:49

+0

雖然 – 2010-08-19 04:25:29

+0

這不會給出「公平」的分配感謝您的幫助,但我決定與第二個答案一起去。 – elais 2010-08-19 04:44:10