如何将随机数生成函数传递给Python类?

时间:2014-08-13 20:19:46

标签: python random

我希望能够将随机数生成器传递给Python中的类。该类表示一个研究模拟,其中使用来自Beta分布的绘制来初始化某组变量,该分布可以使用random.betavariate(2,2)生成,但我希望允许将来的用户插入不同类型的随机数字生成功能,如random.uniform(0,1)

当我尝试这样初始化时......

class simulation:
  def __init__(self,rng):
    self._rng = rng

s = simulation(random.betavariate(2,2))

...错误是我没有传递函数本身,而是传递一个新生成的随机数。

>>> s._rng
0.5013004813544717
>>> s._rng
0.5013004813544717

这么简单的问题:如何将我最喜欢的带有指定参数的随机数生成函数传递给一个类,将它存储在变量中,并在需要时调用它?最好不要期望我的班级用户(重新)在random模块中编写函数。

3 个答案:

答案 0 :(得分:8)

使用partial中的functools绑定参数并获取一个类似于函数的新对象,您可以调用该对象或将其作为类的参数提供。

>>> from functools import partial
>>> import random
>>> r = partial(random.betavariate, 2, 2)
>>> r()
0.7961360011285323
>>> r()
0.15143718490838257

答案 1 :(得分:4)

该函数名为random.betavariate。当你执行random.betavariate(2, 2)时,你会用参数调用它。然后,您将此调用的结果(一个数字)传递给simulation

如果你想传递函数本身,只需传递它:

s = simulation(random.betavariate)

如果你想传递参数,你必须单独进行(并设置你的类,以便它知道在哪里找到这些参数)。

您还可以传递一个ad-hoc函数,将您想要的参数包装到调用中,例如:

s = simulation(lambda: random.betavariate(2, 2))

这会传递一个零参数函数,在调用时会调用random.betavariate(2, 2)

答案 2 :(得分:0)

也许关闭?

>>> class simulation(object):
...     def __init__(self, rng):
...         self.rng = rng
... 
>>> def f(func, *args):
...     def ret():
...         return func(*args)
...     return ret
...
>>> bar = f(random.randint, 0, 9)
>>> s = simulation(bar)
>>> s.rng()
6
>>> s.rng()
3
>>> s.rng()
9
>>> s.rng()
1
>>> 

虽然来自partial的{​​{1}}看起来更自然。