Разделение каждого числа на общее количество может не дать желаемого распределения. Например, с двумя числами пара x, y = random.random (), random.random () равномерно выбирает точку на квадрате 0 <= x <1, 0 <= y <1. Деление на сумму "проецирует" эту точку (x, y) на линию x + y = 1 вдоль линии от (x, y) до начала координат. Точки рядом с (0,5,0,5) будут гораздо более вероятными, чем точки рядом с (0,1,0,9).
Тогда для двух переменных x = random.random (), y = 1-x дает равномерное распределение вдоль геометрического отрезка прямой.
С тремя переменными вы выбираете случайную точку в кубе и проецируете (радиально, через начало координат), но точки рядом с центром треугольника будут более вероятными, чем точки рядом с вершинами. Полученные точки находятся на треугольнике в плоскости x + y + z. Если вам нужен объективный выбор точек в этом треугольнике, масштабирование бесполезно.
Проблема усложняется в n-мерном измерении, но вы можете получить низкую (но высокую точность, для всех вас, фанатов лабораторных исследований!) N, а затем разделив каждую из них на N.
Я недавно придумал алгоритм, чтобы сделать это для небольших n, N. Он должен работать для n = 100 и N = 1 000 000, чтобы дать вам 6-значные случайные числа. Смотрите мой ответ по адресу:
Создавать ограниченные случайные числа?