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

3
我正在使用scipy并想要创建一个平均值为特定值且长度为n的数组。
假设我想要一个长度为3且平均值为2.5的随机数组,那么可能的选项包括: [1.5, 3.5, 2.5] [.25, 7.2, .05] 等等...
我需要创建很多这样不同长度和不同平均数(已指定)的数组,因此一个通用的解决方案将是受欢迎的。

1
平均值必须精确吗?还是你可以将随机数重新聚焦到所需的平均值上,例如,如果标准随机浮点数 [0,1) 的长期平均值为 0.5,则可以通过添加 2 来将中心移动到 2.5。 - Simon MᶜKenzie
列表中的数字是否受非负限制?如果没有限制,我认为您可以将列表全部填充为随机数,除了最后一个数,然后根据其他数字和平均值计算最后一个数字。 - Reorx
是的,这些数字需要是非负数。 - DotPi
3个回答

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(或非常接近2.5)


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

-2

但是你想要什么样的分布呢? - askewchan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接