cesco escreveu:
> I have to generate a list of N random numbers (integer) whose sum is
> equal to M. If, for example, I have to generate 5 random numbers whose
> sum is 50 a possible solution could be [3, 11, 7, 22, 7]. Is there a
> simple pattern or function in Python to accomplish that?
> 
> Thanks and regards
> Francesco
> 

May be this is what you want ...
I didn't test it enough ... but seems fine.

from random import randint,shuffle

def GenRInt(m,n):
        """Generate m positive ints whose sum is n"""
        # Generate a random list
        xl=[randint(1,n-m+1) for i in xrange(m)]
        s=sum(xl)
        if s==n: return xl
        # Adjust each value to make sum==n
        xl=[max(x*n/s,1) for x in xl]
        s=sum(xl)
        if s!=n:
                # Compensate for truncations
                if s>n:
                        # s>n is supposed not to occur. Just in case ...
                        ixs=filter(lambda x: xl[x]>1,range(m))
                        shuffle(ixs)
                        for i in ixs[:s-n]: xl[i]-=1
                else:
                        ixs=range(m)
                        shuffle(ixs)
                        for i in ixs[:n-s]: xl[i]+=1
        return xl

# Test it ...

xl=GenRInt(10,50)
print xl,"->",sum(xl)

print

xl=GenRInt(100,10000)
print xl,"->",sum(xl)

print

xl=GenRInt(1000,1000)
print xl,"->",sum(xl)


Regards.
Paulo
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to