def random_partition(n, s):
    S = s
partition = []
_min = min_max(n, S)
_max = n - S + 1
total = number_of_partitions(n, S)
which = random.randrange(1, total + 1)
while n:
    for k in range(_min, _max + 1):
        count = P(n, S, k)
if count >= which:
    count = P(n, S, k - 1)
break
partition.append(k)
n -= k
if n == 0:
    break
S -= 1
which -= count
_min = min_max(n, S)
_max = k
return partition
Алгоритм случайного создания целочисленных разделов определенной длины в Python?