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

wor*_*joe 4 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))
Run Code Online (Sandbox Code Playgroud)

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

>>> s._rng
0.5013004813544717
>>> s._rng
0.5013004813544717
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*ndh 8

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

>>> from functools import partial
>>> import random
>>> r = partial(random.betavariate, 2, 2)
>>> r()
0.7961360011285323
>>> r()
0.15143718490838257
Run Code Online (Sandbox Code Playgroud)

  • 请注意,你不****"获得新功能"*.从Docs,`partial`"[返回]一个新的*部分对象*,当被调用时*表现得像func*......" (2认同)

Bre*_*arn 5

该函数被调用random.betavariate。当你这样做时random.betavariate(2, 2),你是用参数调用它。然后将此调用的结果(一个数字)传递给simulation

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

s = simulation(random.betavariate)
Run Code Online (Sandbox Code Playgroud)

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

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

s = simulation(lambda: random.betavariate(2, 2))
Run Code Online (Sandbox Code Playgroud)

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