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

2024-10-01 09:31:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望能够将随机数生成器传递到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))

…错误是我传递的不是函数本身,而是一个新生成的随机数。在

^{pr2}$

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


Tags: 函数用户self绘图类型initdef代表
3条回答

使用来自^{}^{}绑定参数并获取一个新的类似函数的对象,您可以调用该对象或将其作为参数提供给类。在

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

也许是个了结?在

>>> 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
>>> 

尽管来自functoolspartial看起来更自然。在

函数名为random.betavariate。当您执行random.betavariate(2, 2)操作时,您是在用参数调用它。然后将这个调用的结果(一个数字)传递给simulation。在

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

s = simulation(random.betavariate)

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

您还可以传递一个特殊函数,该函数将所需参数包装到调用中,例如:

^{pr2}$

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

相关问题 更多 >