Вы можете сделать длину списков более равномерной, настроив веса в зависимости от количества сгенерированных узлов в каждом разделе.Они будут примерно равной длины, если вы выберете функцию так, чтобы вес был равен 0, когда (количество узлов в разделе n)> (количество узлов) / (количество разбиений), то есть
weight [i] = max (numNodes / numPartitions - nodeSoFar [i], 0)
(max () - остановка отрицательных весов, что может произойти, если у вас 4 узла и 3 раздела.)
Затем выберите случайное число от 1 до суммы (веса) (или от 0 до суммы (веса) -1) и выберите соответствующий раздел.
compress()
работает, если вы используете другой селектор для раздела;что-то вроде (x == n for x in random_partition_numbers)
, где random_partition_numbers - это генератор.Конечно, вам нужно будет скопировать random_partition_numbers для каждого раздела.Этот дизайн по своей сути медленнее, так как он должен перебирать список узлов для каждого раздела.