2015-07-12 54 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 
相关问题