2013-03-19 76 views
2

我正在使用scipy并希望创建一个具有特定平均值的第n个数组。创建一个具有特定平均值的随机数组

假设我想长度为3的平均为2.5的随机阵列,因此可能的选项可以是: [1.5,3.5,2.5] [0.25,7.2,0.05] 等等等等...

我需要创建许多这样的数组,具有不同的长度和不同的平均值(指定)为每个,所以广泛的解决方案将受到欢迎。

+1

平均值是否应该是精确的,或者您是否可以将您的随机数重新居中在期望的平均值附近,即if标准随机浮点数[0,1)的长期平均值为0.5,那么您可以通过将中心值加2来移动2.5 ... – 2013-03-19 04:51:39

+0

列表中的数字是否被限制为非负数?如果没有限制,我认为你可以用除最后一个之外的随机数填写全部列表,然后根据其他数字和平均值计算最后一个数字。 – Reorx 2013-03-19 05:00:57

+0

是的,这些数字必须是非负数。 – DotPi 2013-03-19 05:03:37

回答

9

就产生(在这种情况下,0〜10)在你想要的数字范围

>>> import random 
>>> nums = [10*random.random() for x in range(5)] 

,你想让它

锻炼身体的平均

>>> sum(nums)/len(nums) 
4.2315222659844824 

移平均

>>> nums = [x - 4.2315222659844824 + 2.5 for x in nums] 
>>> nums 
[-0.628013346633133, 4.628537956666447, -1.7219257458163257, 7.617565127420011, 2.6038360083629986] 
>>> sum(nums)/len(nums) 
2.4999999999999996 

你可以使用你喜欢的任何分布/范围。通过以这种方式平均移动平均值,它总是会让你的平均值为2.5(或非常接近平均值)

2

你还没有指定你想要的发行版。

您是否希望实际数组的平均值为2.5,或者所有数组的平均值为2.5,这一点也不清楚。

最简单的解决方案,三个随机在一个甚至从0分配号码2 *平均-是这样的:

return 2*avg * np.random.rand(3) 

如果要保证数组的平均值是2.5,这是一个非常简单的约束条件,但有很多不同的方法可以满足它,并且需要描述你想要的方式。例如:

n0 = random.random() * 2*avg 
n1 = random.random() * (2*avg - n0) 
n2 = random.random() * (2*avg - n0 - n1) 
return np.array((n0, n1, n2)) 
相关问题