Ну, мы могли бы использовать распределение, результат которого естественно суммирует с известным значением, и
с фиксированным числом выбранных чисел также будет означать среднее.
Среднее значение 5 и число выборок, равное 15, означают, что общая сумма числа всегда должна быть равна 75.
Простейшим является Мультивыбор , поэтому давайте использовать его из NumPy. Мы устанавливаем равные вероятности на 1/15, выборка в диапазоне [0 ... 30] и отклоняем выборку, если какие-либо значения находятся выше желаемого диапазона.
Это быстрее, чем метод, предложенный @jbch, нет ручного баланса сумм и средних, и гистограмма распределения ближе к симметричной, если вы заботитесь об этом
код
import numpy as np
def multiSum(n, p, maxv):
while True:
v = np.random.multinomial(n, p, size=1)
q = v[0]
a, = np.where(q > maxv) # are there any values above max
if len(a) == 0: # accept only samples below or equal to maxv
return q
N = 15
p = np.full((N), 1.0/np.float64(N))
mean = 5
start = 3
stop = 7
n = N*mean - N*start
h = np.zeros((5), dtype=np.int64)
print(h)
for k in range(0, 10000):
ns = multiSum(n, p, stop-start) + start # result in [3...7]
#print(np.mean(ns))
for v in ns:
h[v-start] += 1
print(h)
Типичная выходная гистограмма на моем компьютере
[15698 38107 44584 33719 17892]
@ jbch выходная гистограмма
[17239 39237 42188 28957 22379]