2015-07-12 61 views

回答

2

首先,認識對於固定的n,你不能(一般情況下)選擇數組的平均值爲,正好爲,任意值爲m。我會假設你要麼選擇m這樣的解決方案是可行的,要麼你可以得到接近於給定值的東西。

n1 1s和n2 -1s的均值是(n1 - n2)/n其中n = n1 + n2。所以你想要m = (n1 - n2)/n = (n1 - (n - n1))/n = (2*n1 - n)/n = 2*n1/n - 1。這給出n1 = (m + 1)*n/2(其適用於-1 < = m < = 1)。因此,您可以使用n1 1s和n - n1 -1s創建一個數組,然後隨機化該數組。

例如,假設n爲100,和所期望的平均值是0.8:

In [35]: n = 100 

In [36]: m = 0.8 

計算陽性的1的數量:

In [37]: n1 = int(round((m + 1) * n/2.0)) # rounded to the nearest int 

創建的1的陣列和-1s:

In [38]: x = np.ones(n, dtype=int) 

In [39]: x[:n-n1] = -1 

隨機播放它:

In [40]: np.random.shuffle(x) 

In [41]: x 
Out[41]: 
array([ 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 
     1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 
     -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 
     -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1]) 

In [42]: x.mean() 
Out[42]: 0.80000000000000004 
4

您可以選擇輸入傳遞給random.choice的數組中每個元素的概率值。在這種情況下,您的平均值或預期值是p - q,其中p是正數的概率,q是負數的概率。請注意,這與n無關。如果你設置一個正數的概率爲p,那麼負數的概率爲1 - p。然後你可以求解2p - 1 = m來獲得給定m所需的p值。

例如,對於一般的米至是0.4,你會通過[0.7 .3]作爲概率:

numpy.random.choice([1, -1], n, p=[.7, .3]) 

下面是一個例子:

In [25]: 
n = 1e6 
m = .4 
p = (m + 1)/2 
np.random.choice([1, -1], n, p=[p, 1-p]).sum()/n 

Out[25]: 
0.39873799999999998 
相關問題