Lets see a perl/python/... equivalent to this lisp exercise for obtaining 'e':
[...]

Euler's number, 'e', is approximately 2.7182818284590452354, and this is a highly-inefficient way to extract it, but
the function does tend toward 'e'.)

Jim

If you like this kind of stuff, you'd probably get a kick out of
Doug McIlroy's "The Music of Streams", available on his home page:
http://www.cs.dartmouth.edu/~doug/

I toyed with the code in python a little:
  http://lava.net/~newsham/x/machine/powerseries.py
  http://lava.net/~newsham/x/machine/powerseries2.py

but neither is as elegant as his (pseudo-) haskell implementation


Heres your python code:

#!/usr/bin/python

import random

uniform = random.random         # gratuitous rename

def waitTime() :
        """Return the number of uniform variates whose sum just exceeds 1."""
        sum,times = 0,0
        while sum <= 1.0 :
                sum,times = sum+uniform(), times+1
        return times

def repeat(n, f, *args, **kwargs) :
        """Return the results of running a function n times."""
        return [f(*args, **kwargs) for n in xrange(n)]

def average(l) :
        """
        Return the average of a list.
        Raise an exception for empty lists.
        """
        return float(sum(l)) / len(l)

# show some waitTime results
print "Some waitTimes", repeat(10, waitTime)

# show averages for increasing lengths of repeat(waitTime)
print "average waitTimes", [average(repeat(n, waitTime)) for n in 1, 10, 100, 
1000, 10000, 100000]



Tim Newsham
http://www.lava.net/~newsham/

Reply via email to