[Tutor] random number equations . . .
rantek at pacific.net.sg
rantek at pacific.net.sg
Fri Jun 4 04:12:50 EDT 2004
Wouldn't using fixed point representation (32bit) improve the accuracy?
Bill
>
> From: "Glen Wheeler" <gew75 at hotmail.com>
> Date: Fri 04/06/2004 7:18 AM GMT+08:00
> To: "Danny Yoo" <dyoo at hkn.eecs.berkeley.edu>
> CC: Dragonfirebane at aol.com, tutor at python.org
> Subject: Re: [Tutor] random number equations . . .
>
>
> Hi Danny,
>
> You are of course correct! My purpose in showing the usage of creating
> one's own random numbers from random.random() is for understanding and
> flexibility. I guess if I was to write a ``proper'' myRandRange(..)
> function I'd probably add 1 to the range then truncate. Actually, let's try
> that:
>
> >>> def myRandRange(n):
> .. return int((random.random()*(n+1)))
> >>> distribution([myRandRange(2) for i in range(1000)])
> {0: 320, 1: 331, 2: 349}
>
> Seems to work ok.
> Bias is one reason why someone may *want* to use their own function for
> this kind of purpose. I know that in several of my applications, I wish to
> generate random numbers based on a custom distribution, so I have this set
> up in a function.
> Now before you go off and point me to the docs, I do know that the random
> module has builtin distributions, and do know how to express distributions
> as functions of other standard distributions. But not every single
> distribution can be expressed as such, and it is easier to debug when you
> know exactly what is going on.
> I guess my ``teach the basics first'' philosophy shows through in a bad
> way sometimes.
>
> --
> Glen
>
> ----- Original Message -----
> From: "Danny Yoo" <dyoo at hkn.eecs.berkeley.edu>
> To: "Glen Wheeler" <gew75 at hotmail.com>
> Cc: <Dragonfirebane at aol.com>; <tutor at python.org>
> Sent: Friday, June 04, 2004 8:39 AM
> Subject: Re: [Tutor] random number equations . . .
>
>
> >
> > Hi Glen,
> >
> > But whenever we're dealing with probability, it's often a good idea to
> > reuse what other folks have already done. *grin*
> >
> >
> > This kind of selection function already exists in random.randrange():
> >
> > http://www.python.org/doc/lib/module-random.html#l2h-1147
> >
> >
> > The problem with gimmeRandomInRange() is that it's biased. It's easier to
> > see what this means if we use a small range. Let's see what happens when
> > we use it for a range between 0 and 2, inclusive:
> >
> > ###
> > >>> def distribution(numbers):
> > ... """Calculates a distribution of the numbers."""
> > ... counts = {}
> > ... for n in numbers:
> > ... counts[n] = counts.get(n, 0) + 1
> > ... return counts
> > ...
> > >>> distribution([gimmeRandomInRange(2) for i in range(1000)])
> > {0: 238, 1: 523, 2: 239}
> > ###
> >
> >
> > There's a big hump near one!
> >
> >
> > Why is that? Why are the numbers biased biased around 1? If we draw
> > things out:
> >
> > A B C
> > |--------(---------------)-------|
> > 0 0.5 1 1.5 2
> >
> >
> > our number line splits into three regions A, B, and C. The behavior of
> > the round()ing causes region B to be larger than the other two.
> >
> >
> > But random.randrange() doesn't suffer this defect:
> >
> > ###
> > >>> distribution([random.randrange(0, 3) for i in range(1000)])
> > {0: 343, 1: 344, 2: 313}
> > ###
> >
> >
> > The 'random' module has many helper functions that we should use.
> > They're there because it's all too easy not to take into consideration
> > some of the subtle problems with random number generation.
> >
> >
> >
> > Hope this helps!
> >
> >
>
> _______________________________________________
> Tutor maillist - Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
>
More information about the Tutor
mailing list