Вот как это сделать в Python
import random
def random_values_with_prescribed_sum(n, total):
x = [random.random() for i in range(n)]
k = total / sum(x)
return [v * k for v in x]
В основном вы выбираете n случайных чисел, вычисляете их сумму и вычисляете масштабный коэффициент так, чтобы сумма была такой, какой вы хотите.
Обратите внимание, что при таком подходе не будут получаться "однородные" срезы, т. Е. Распределение, которое вы получите, будет иметь тенденцию быть более "равноправным", чем должно быть, если бы оно было выбрано случайным образом среди всего распределения с данной суммой.
Чтобы увидеть причину, вы можете просто представить, что делает алгоритм в случае двух чисел с заданной суммой (например, 1):
Точка P
является общей точкой, полученной путем выбора двух случайных чисел, и она будет равномерной внутри квадрата [0,1]x[0,1]
. Точка Q
- это точка, полученная путем масштабирования P
, так что сумма должна быть равна 1. Как видно из рисунка, точки, расположенные близко к центру, имеют более высокую вероятность; например, точный центр квадратов будет найден путем проецирования любой точки по диагонали (0,0)-(1,1)
, в то время как точка (0, 1)
будет найдена, проецируя только точки из (0,0)-(0,1)
... длина диагонали равна sqrt(2)=1.4142...
, в то время как квадратная сторона только 1.0
.