¿Distribución de enteros usando pesas? ¿Como calcular

Necesito distribuir un valor basado en algunos pesos. Por ejemplo, si mis pesos son 1 y 2, entonces esperaría que la columna ponderada como 2 tenga el doble del valor que la columna ponderada 1.

Tengo un código de Python para demostrar lo que estoy tratando de hacer, y el problema:

def distribute(total, distribution):
    distributed_total = []
    for weight in distribution:
        weight = float(weight)
        p = weight/sum(distribution)
        weighted_value = round(p*total)
        distributed_total.append(weighted_value)
    return distributed_total

for x in xrange(100):
    d = distribute(x, (1,2,3))
    if x != sum(d):
        print x, sum(d), d

El código anterior muestra muchos casos en los que la distribución de un valor da como resultado que la suma de la distribución sea diferente del valor original. Por ejemplo, distribuir 3 con pesos de (1,2,3) da como resultado (1,1,2), que totaliza 4.

Cuál es la forma más sencilla de arreglar este algoritmo de distribución?

ACTUALIZAR

Espero que los valores distribuidos sean valores enteros. No importa exactamente cómo se distribuyen los enteros siempre que sumen el valor correcto, y estén "lo más cerca posible" de la distribución correcta.

(Por distribución correcta me refiero a la distribución no entera, y no he definido completamente lo que quiero decir con "lo más cerca posible". Quizás haya varias salidas válidas, siempre que sumen el valor original).

Respuestas a la pregunta(8)

Su respuesta a la pregunta