random value generation

Bengt Richter bokr at oz.net
Thu Aug 14 11:51:52 EDT 2003


On Tue, 12 Aug 2003 11:57:28 -0700 (PDT), Brandon Michael Moore <brandon at its.caltech.edu> wrote:

>I'm trying to test a web application using a tool written in python. I
>would like to be able to generate random values to put in fields. I would
>like to be able to generate random dates (in a specified range), random
>strings (specifying allowed characters and a distribution of lengths), or
>choose randomly between several generators (for better control of the
>distribution of values).
>
>Is there any library for this sort of thing in Python? I've started a
>library heavily based off the generators of Haskell's QuickCheck library,
>that represents generators as objects with a generate() method, with
>constructor parameters (maybe other generators) the control the resulting
>distribution.
>
>I've got Choose that takes a list of generators and chooses between them
>(with random.choice), GMap that maps a function over the output of another
>generator, Choice that chooses an element from a list, Expo that wraps
>random's expovariate, and List that takes a number generator and an
>element generator and generates lists with lengths drawn from the first
>generator and elements drawn from the second, and String that's like List
>but joins the resulting list with ''.
>
>I can use these classes like Choice(['red','blue','green']), or
>String(Expo(1.0/3),Choice(string.lower)).
>
>Are there any existing libraries for this sort of thing? Or at least, can
>anyone suggest a cleaner way of doing this? (I don't like creating classes
>for things that should really be functions, but I need to call the random
>number generator each time I use the generator, not once when I define it)
>
>Brandon
>
Have you looked at the time and random modules? E.g.,

 >>> import time, random
 >>> time.localtime()
 (2003, 8, 14, 8, 45, 13, 3, 226, 1)
 >>> midday = time.mktime((2003,8,14,12,0,0,0,0,1))
 >>> time.ctime(midday)
 'Thu Aug 14 12:00:00 2003'
 >>> time.strftime
 <built-in function strftime>
 >>> time.strftime.__doc__
 'strftime(format[, tuple]) -> string\n\nConvert a time tuple to a string according to a format s
 pecification.\nSee the library reference manual for formatting codes. When the time tuple\nis no
 t present, current time as returned by localtime() is used.'

 >>> time.strftime('%Y%m%d %H%M%S',time.localtime(midday))
 '20030814 120000'
 >>> time.strftime('%y%m%d %H%M%S',time.localtime(midday))
 '030814 120000'

Set some seed to have a way to restart the same sequence if desired
 >>> random.seed(1234)

Vary times uniformly forawrd 24 hours from midday
 >>> for i in xrange(10): print time.strftime('<%Y-%m-%d %H%M%S>', time.localtime(midday+random.r
 andom()*3600*24))
 ...
 <2003-08-15 111141>
 <2003-08-14 223439>
 <2003-08-14 121047>
 <2003-08-15 095148>
 <2003-08-15 103232>
 <2003-08-15 015824>
 <2003-08-15 040703>
 <2003-08-14 140052>
 <2003-08-15 062343>
 <2003-08-14 174100>

or vary uniformly forward one hour from midday:

 >>> for i in xrange(10): print time.strftime('<%Y-%m-%d %H%M%S>', time.localtime(midday+random.r
 andom()*3600))
 ...
 <2003-08-14 120150>
 <2003-08-14 124719>
 <2003-08-14 122045>
 <2003-08-14 123723>
 <2003-08-14 123656>
 <2003-08-14 120854>
 <2003-08-14 121059>
 <2003-08-14 120651>
 <2003-08-14 120052>
 <2003-08-14 122912>

of course you can use other distributions and time formats too. This was just a quick demo.

Generating and/or selecting random strings seems not too challenging, unless you
have some tricky requirements.

Regards,
Bengt Richter




More information about the Python-list mailing list