En divisant chaque nombre par le total, vous n'obtiendrez peut-être pas la répartition souhaitée. Par exemple, avec deux nombres, la paire x,y = random.random(), random.random() choisit un point uniformément sur le carré 0<=x<1, 0<=y<1. La division par la somme "projette" ce point (x,y) sur la ligne x+y=1 le long de la ligne allant de (x,y) à l'origine. Les points proches de (0,5,0,5) seront beaucoup plus probables que les points proches de (0,1,0,9).
Pour deux variables, donc, x = random.random(), y=1-x donne une distribution uniforme le long du segment de ligne géométrique.
Avec 3 variables, vous choisissez un point aléatoire dans un cube et vous le projetez (radialement, en passant par l'origine), mais les points proches du centre du triangle seront plus probables que les points proches des sommets. Les points résultants se trouvent sur un triangle dans le plan x+y+z. Si vous avez besoin d'un choix non biaisé de points dans ce triangle, la mise à l'échelle n'est pas bonne.
Le problème se complique en n dimensions, mais vous pouvez obtenir une estimation de faible précision (mais de grande exactitude, pour tous les amateurs de sciences de laboratoire !) en choisissant uniformément dans l'ensemble des n-tuples d'entiers non négatifs dont la somme est égale à N, puis en divisant chacun d'eux par N.
J'ai récemment mis au point un algorithme permettant de faire cela pour des n de taille modeste, N. Il devrait fonctionner pour n=100 et N = 1 000 000 pour vous donner des aléas à 6 chiffres. Voir ma réponse à l'adresse suivante :
Créer des nombres aléatoires contraints ?