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

fumanchu fumanchu at amor.org
Sun Apr 23 16:54:48 EDT 2006


I'm surprised noone has pursued a course of subtraction rather than
division. Say you want 10 numbers:

>>> s = 1.0
>>> n = []
>>> for x in xrange(9):
... 	value = random.random() * s
... 	n.append(value)
... 	s -= value
...
>>> n.append(s)
>>> n
[0.7279111122901516, 0.082128708606867745, 0.0080516733577621798,
0.12122060245902817, 0.0034460458833209676, 0.0021046234724371184,
0.054109424914363845, 0.00035750970249204185, 0.00051175075536832372,
0.00015854855820800087]
>>> sum(n)
1.0


Either:
 1) Just because they're *ordered* doesn't mean they're not *random*,
or
 2) You all now know why I'm not a mathematician. ;)

It seems to me that the only constraint on the randomness of my results
is the OP's constraint: that they sum to 1. I'd be fascinated to learn
if and why that wouldn't work.


Robert Brewer
System Architect
Amor Ministries
fumanchu at amor.org




More information about the Python-list mailing list