Один из подходов может быть следующим: Подумайте о массиве ( сумма - 1) битов.Выберите ( n - 1) из них как 1, остальные 0. Теперь между ними, как и до первого, и после последнего, у вас есть серии нулей или более.Возьмите длину каждого прогона, добавьте 1 (чтобы превратить неотрицательное в положительное), и вы получите n натуральных чисел, которые в сумме составляют sum .
Изс точки зрения реализации, вам не нужен этот массив;все, что вам нужно, это позиции тех.Убедитесь, что они различны, и убедитесь, что они находятся в диапазоне от 0 до сумма - 1 исключение.
def random_partition(n, sum):
indices = [-1] + sorted(random.sample(range(sum - 1), n - 1)) + [sum - 1]
return [indices[i + 1] - indices[i] for i in range(n)]
Полученные целые числа будут не следовать занормальное распределение.Как уже отмечалось в комментариях, нормальное распределение - это непрерывное распределение, в то время как вы запрашиваете целые числа, поэтому вам нужно дискретное распределение.Я думаю, что это не совсем биномиальное распределение.Но так как вы, кажется, не совсем уверены в том, какой дистрибутив вам нужен точно , возможно, это достаточно близко к нормальному дистрибутиву, чтобы удовлетворить ваши потребности.Я, честно говоря, не знаю названия для дистрибутива, который вы получите;Возможно, вы захотите проверить Cross Validated об этом.