Generate a sequence of random numbers that sum up to 1?

Gerard Flanagan grflanagan at yahoo.co.uk
Sat Apr 22 09:57:23 EDT 2006


Gerard Flanagan wrote:
> Gerard Flanagan wrote:
> > Anthony Liu wrote:
> > > I am at my wit's end.
> > >
> > > I want to generate a certain number of random numbers.
> > >  This is easy, I can repeatedly do uniform(0, 1) for
> > > example.
> > >
> > > But, I want the random numbers just generated sum up
> > > to 1 .
> > >
> > > I am not sure how to do this.  Any idea?  Thanks.
> > >
> >
> > --------------------------------------------------------------
> > import random
> >
> > def partition(start=0,stop=1,eps=5):
> >     d = stop - start
> >     vals = [ start + d * random.random() for _ in range(2*eps) ]
> >     vals = [start] + vals + [stop]
> >     vals.sort()
> >     return vals
> >
> > P = partition()
> >
> > intervals = [ P[i:i+2] for i in range(len(P)-1) ]
> >
> > deltas = [ x[1] - x[0] for x in intervals ]
> >
> > print deltas
> >
> > print sum(deltas)
> > ---------------------------------------------------------------
> >
>
> def partition(N=5):
>     vals = sorted( random.random() for _ in range(2*N) )
>     vals = [0] + vals + [1]
>     for j in range(2*N+1):
>         yield vals[j:j+2]
>
> deltas = [ x[1]-x[0] for x in partition() ]
>
> print deltas
>
> print sum(deltas)
>

finally:

---------------------------------------------------------------
def distribution(N=2):
    p = [0] + sorted( random.random() for _ in range(N-1) ) + [1]
    for j in range(N):
        yield p[j+1] - p[j]

spread = list(distribution(10))

print spread
print sum(spread)
---------------------------------------------------------------
Gerard




More information about the Python-list mailing list