Простым способом было бы начать с равномерного распределения, а затем случайным образом выбрать два индекса и переместить случайное количество, ограниченное минимальным и максимальным значениями, от одного к другому.Сделайте это определенное количество раз, и последовательность должна быть достаточно случайной при сохранении всех ограничений.
from random import randint, randrange
n, k = 30000, 100
mn, mx = 5, 1000
nums = [n//k for _ in range(k)]
for _ in range(10000):
a, b = randrange(k), randrange(k)
swap = randint(0, min(mx - nums[a], nums[b] - mn))
nums[a] += swap
nums[b] -= swap
print(min(nums), max(nums), sum(nums))
# 5 1000 30000
print(nums)
# [9, 773, 65, 812, 23, 124, 396, 406, 51, 241, 241, 841, 274, 210, 28, 213, 550, 131, 243, 974, 194, 927, 174, 910, 121, 230, 22, 7, 22, 128, 404, 247, 276, 8, 118, 68, 5, 216, 45, 10, 43, 32, 723, 56, 398, 12, 861, 625, 200, 755, 6, 563, 77, 279, 424, 6, 523, 15, 540, 858, 925, 491, 21, 499, 984, 21, 397, 18, 219, 83, 5, 171, 588, 159, 126, 796, 5, 68, 62, 12, 169, 849, 96, 426, 637, 127, 44, 497, 237, 597, 447, 19, 12, 267, 85, 78, 112, 471, 447, 1000]
Для простоты предполагается, что n
равномерно делится на k
, но даже еслиэто не так, что первый шаг будет легко адаптироваться.