一种使结果真正接近您想要的结果的方法是生成两个独立的随机范围,长度为100,满足您的中值约束,并包含所有期望的数字范围。然后通过连接数组,平均值将大约为12,但不完全等于12。但因为这只是意味着你要处理的,你可以简单地通过调整这些数组中的一个来生成你期望的结果。在In [162]: arr1 = np.random.randint(2, 7, 100)
In [163]: arr2 = np.random.randint(7, 40, 100)
In [164]: np.mean(np.concatenate((arr1, arr2)))
Out[164]: 12.22
In [166]: np.median(np.concatenate((arr1, arr2)))
Out[166]: 6.5
下面是一个矢量化的非常优化的解决方案,它通过限制随机序列的创建来对抗任何其他使用循环或python级别代码的解决方案:
^{pr2}$
演示:arr = gen_random()
print(np.median(arr))
print(arr.mean())
6.5
12.0
函数背后的逻辑:
为了让我们有一个符合这个标准的随机数组,我们可以将3个数组连接在一起arr1,mid和{}。arr1和arr2各包含99个项目,mid包含2个项目6和7,因此最终结果为6.5作为中位数。现在我们创建两个长度为99的随机数组。要使结果具有12个平均值,我们需要做的就是找出当前和与12 * 200之间的差,然后从我们的N个最大数中减去结果,在这种情况下,我们可以从arr2中选择它们并使用N=50。在
编辑:
如果在结果中使用浮点数不是问题,您可以实际缩短函数,如下所示:import numpy as np
import math
def gen_random():
arr1 = np.random.randint(2, 7, 99).astype(np.float)
arr2 = np.random.randint(7, 40, 99).astype(np.float)
mid = [6, 7]
i = ((np.sum(arr1 + arr2) + 13) - (12 * 200)) / 40
args = np.argsort(arr2)
arr2[args[-40:]] -= i
return np.concatenate((arr1, mid, arr2))