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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Python中为概率密度函数生成随机数相关的知识,希望对你有一定的参考价值。

我目前正在研究一个与布朗运动相关的项目,并尝试使用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后面得到随机数;这些十六进制是什么意思?

答案

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

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

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

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

另一答案

如上所述,这是一个内存位置。你的函数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类并调用计算方法。

以上是关于在Python中为概率密度函数生成随机数的主要内容,如果未能解决你的问题,请参考以下文章

如何根据概率密度函数产生随机数

matlab 求已知概率密度函数的随机数生成

《R语言实战》自学笔记26-概率函数

概率密度函数怎么求呢?

已知分布函数如下,求概率密度,请写出具体步骤

概率密度函数(PDF)和累积概率密度函数(CDF)