在Python中为概率密度函数生成随机数

时间:2018-02-07 22:20:43

标签: python scipy probability-density

我目前正在开展一个与布朗运动相关的项目,并尝试使用Python模拟其中的一些(我认为这是一种非常新的语言)。目前,我的目标是在给定的概率密度函数之后生成随机数。我一直在尝试使用scipy库。

我目前的代码如下:

>>> import scipy.stats as st
>>> class my_pdf(st.rv_continuous):
        def _pdf(self,x,y):
            return (1/math.sqrt(4*t*D*math.pi))*(math.exp(-((x^2)/(4*D*t))))*(1/math.sqrt(4*t*D*math.pi))*(math.exp(-((y^2)/(4*D*t))))
>>> def get_brown(a,b):
        D,t = a,b
        return my_pdf()
>>> get_brown(1,1)
<__main__.my_pdf object at 0x000000A66400A320>

所有尝试启动 get_brown 函数最终都会给我这些十六进制数(总是从0x000000A66400A开始,只有最后三位数字会改变,无论我为D和t给出什么参数)。我不确定如何解释。我想要的是在给定的PDF后面得到随机数;这些十六进制是什么意思?

2 个答案:

答案 0 :(得分:1)

您看到的结果是您创建的对象的内存地址。现在您可能会问:哪个对象?您的方法get_brown(int, int)调用return my_pdf(),它会创建类my_pdf的对象并将其返回。如果您想立即访问班级的_pdf函数并计算pdf的值,可以使用此代码:

get_brown(1,1)._pdf(x, y)

在您刚创建的对象上,您还可以使用scipy.stats.rv_continous类的所有方法,您可以找到here

根据您的情况,您也可以丢弃当前代码,并使用scipy中包含的正态分布,因为布朗运动主要是正常随机过程。

答案 1 :(得分:0)

如上所述,这是一个内存位置。您的函数get_brown获取my_pdf类的实例,但不评估该类中的方法。

您可能想要做的是在该实例上调用_pdf方法,而不是返回类本身。

def get_brown(a,b):
    D,t = a,b  #  what is D,t for?
    return my_pdf()_pdf(a,b)

我希望您发布的代码简化了您的实际操作,但函数不需要在类中 - 因此_pdf函数可以独立存在。或者,您不需要使用get_brown函数 - 只需实例化my_pdf类并调用计算方法。