创建一个具有特定平均值的随机数组

3 投票
3 回答
1664 浏览
提问于 2025-04-17 19:36

我正在使用scipy,想要创建一个长度为n的数组,并且这个数组有一个特定的平均值。

比如说,我想要一个长度为3的随机数组,平均值是2.5,那么可能的选项可以是: [1.5, 3.5, 2.5] [0.25, 7.2, 0.05] 等等等等……

我需要创建很多这样的数组,长度和平均值都不一样(每个都指定),所以如果能有一个通用的解决方案就太好了。

3 个回答

-2

我找到了解决这个问题的方法。

可以使用这个函数:numpy.random.triangular(left, mode, right, size=None)

你可以访问这个链接了解更多信息: http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.triangular.html#numpy.random.triangular

不过,有一个小问题就是它会强制样本遵循三角分布。

2

你没有说明你想要什么样的分布。

也不清楚你是想让实际数组的平均值是2.5,还是所有数组的平均值是2.5。

最简单的解决办法是从0到2*avg之间随机选三个数字,分布要均匀,代码如下:

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))
10

只需要生成你想要的数字范围(在这个例子中是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(或者非常接近这个值)

撰写回答