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

Anthony Liu antonyliu2002 at yahoo.com
Sat Apr 22 00:49:06 EDT 2006


OK, I actually just want to "manually" create Hidden
Markov Models by randomly generating the initial state
probabilities PI, the transition probabilities A and
the emission probabilities B, instead of learning such
statistics from a corpus.  They have to be subject the
constraint that 

sum(PI) = 1.0
sum(each row of A) = 1.0
sum(each row of B) = 1.0

Got an idea?

Thank you for your help.  I guess I can use random()
instead of uniform(0,1) given your comments about
uniform.  I did not know the uniform function until a
moment ago when I checked the python.org
documentation.

As a matter of fact, given that we have to specify the
number of states for an HMM, I would like to create a
specified number of random floating numbers whose sum
is 1.0.



--- Edward Elliott <nobody at 127.0.0.1> wrote:

> Anthony Liu wrote:
>  > But, I want the random numbers just generated sum
> up
>  > to 1 .
> 
> This seems like an odd request.  Might I ask what
> it's for?
> 
> Generating random numbers in [0,1) that are both
> uniform and sum to 1 looks 
> like an unsatisfiable task.  Each number you
> generate restricts the 
> possibilities for future numbers.  E.g. if the first
> number is 0.5, all 
> future numbers must be < 0.5 (indeed, must *sum* to
> 0.5).  You'll end up 
> with a distribution increasingly skewed towards
> smaller numbers the more 
> you generate.  I can't imagine what that would be
> useful for.
> 
> If that's not a problem, do this: generate the
> numbers, add them up, and 
> divide each by the sum.
> 
> nums = [random.uniform(0,1) for x in range(0,100)]
> sum = reduce(lambda x,y: x+y, nums)
> norm = [x/sum for x in nums]
> 
> Of course now the numbers aren't uniform over [0,1)
> anymore.
> 
> Also note that the sum of the normalized numbers
> will be very close to 1, 
> but slightly off due to representation issues.  If
> that level of accuracy 
> matters, you might consider generating your rands as
> integers and then 
> fp-dividing by the sum (or just store them as
> integers/fractions).
> -- 
> http://mail.python.org/mailman/listinfo/python-list
> 


__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 



More information about the Python-list mailing list