Es posible que dividir cada número por el total no le proporcione la distribución que desea. Por ejemplo, con dos números, el par x, y = random.random (), random.random () elige un punto uniformemente en el cuadrado 0 <= x <1, 0 <= y <1. Dividir por la suma "proyecta" ese punto (x, y) sobre la línea x + y = 1 a lo largo de la línea desde (x, y) hasta el origen. Los puntos cercanos (0.5,0.5) serán mucho más probables que los puntos cercanos (0.1,0.9).
Para dos variables, entonces, x = random.random (), y = 1-x da una distribución uniforme a lo largo del segmento de línea geométrica.
Con 3 variables, está eligiendo un punto aleatorio en un cubo y proyectando (radialmente, a través del origen), pero los puntos cerca del centro del triángulo serán más probables que los puntos cerca de los vértices. Los puntos resultantes están en un triángulo en el plano x + y + z. Si necesita una elección imparcial de puntos en ese triángulo, la escala no es buena.
El problema se complica en n dimensiones, pero puede obtener una estimación de baja precisión (¡pero alta, para todos los fanáticos de las ciencias de laboratorio!) Eligiendo uniformemente del conjunto de todas las n-tuplas de enteros no negativos que suman N, y luego dividiendo cada uno de ellos por N.
Recientemente se me ocurrió un algoritmo para hacer eso para n, N de tamaño modesto. Debería funcionar para n = 100 y N = 1,000,000 para darle aleatorias de 6 dígitos. Vea mi respuesta en:
¿Crear números aleatorios restringidos?