私は scipy を使用しており、特定の平均で長さ n の配列を作成したいと考えています。
長さ 3、平均 2.5 のランダムな配列が必要だとすると、可能なオプションは次のようになります: [1.5, 3.5, 2.5] [.25, 7.2, .05] など...
さまざまな長さとそれぞれに異なる平均 (指定) を持つこのような配列を多数作成する必要があるため、一般化されたソリューションを歓迎します。
必要な範囲の数値を生成するだけです (この場合は 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.5 にするかは明確ではありません。
最も単純な解決策 (0 から 2*avg までの均等分布の 3 つの乱数) は次のとおりです。
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))
問題の解決策を見つけました。
numpy.random.triangular(左、モード、右、サイズ=なし)
ただし、小さな問題は、サンプルに三角形の分布が強制されることです。