443,908 Members | 1,860 Online Need help? Post your question and get tips & solutions from a community of 443,908 IT Pros & Developers. It's quick & easy.

# Dispatching functions from a dictionary

 P: n/a To keep a simulation tidy, I created a dispatcher that generates random variables drawn from various distributions as follows: import random RVType = 1 #Type of random variable - pulled from RVDict RVDict= {'1': random.betavariate(1,1), '2': random.expovariate(1), '3': random.gammavariate(1,1), '4': random.gauss(0,1), '5': random.lognormvariate(1,1), '6': random.paretovariate(1), '7': random.uniform( -1,1), '8': random.weibullvariate(1,2) } x = [] y=[] rv = RVDict[str(RVType)] for i in range(N): x.append(rv) y.append(rv) Oddly, x and y get filled with a single value repeated N times. I expected to get a different random number appear each time I called rv ,but this does not happen. Instead, my first call to rv generates a random number from the appropriate distribution, while subsequent calls simply repeat the random number generated in the first call. Where am I going wrong? Thanks in advance for your help. Sincerely Thomas Philips Mar 30 '08 #1
3 Replies

 P: n/a tk****@gmail.com writes: RVDict= {'1': random.betavariate(1,1), '2': random.expovariate(1), ...} This actually calls the functions random.betavariate, etc. when initializing RVDict. If you print out the contents of RVDict you'll see that each value in it is just a floating point number, not a callable. You want something like: RVDict = {'1': lambda: random.betavariate(1,1), '2': lambda: random.expovariate(1), etc. The "lambda" keyword creates a function that when called evaluates the expression that you gave it. For example, lambda x: x*x is a function that squares its argument, so saying y = (lambda x: x*x) (3) is similar to saying: def square(x): return x*x y = square(3) Both of them set y to 9. In the case of lambda: random.expovariate(1) you have made a function with no args, so you'd call it like this: rvfunc = RVDict[str(RVType)] for i in range(N): x.append(rvfunc()) y.append(rvfunc()) rvfunc (the retrieved dictionary item) is now a callable function instead of just a number. It takes no args, so you call it by saying rvfunc(). Mar 30 '08 #2

 P: n/a On Mar 30, 5:06 pm, Paul Rubin

 P: n/a Paul, George, Thanks a mill - the help is greatly appreciated. Thomas Philips Mar 31 '08 #4

### This discussion thread is closed

Replies have been disabled for this discussion. 