【问题标题】:Random number generator from a given distribution function来自给定分布函数的随机数生成器
【发布时间】:2020-10-25 12:02:14
【问题描述】:

我是编程新手。我有两个范围的密度函数。我怎样才能根据这个函数得到随机函数。 最后一次返回时间的概率密度函数为:

      (1/sqrt(2*pi*std**2))*exp(-(x+24-µ2)**2/2*std**2)   ,   0 < x ≤ µ2 − 12
f(x) =
       (1/sqrt(2*pi*std**2))*exp(-(x-µ2)**2/2*std**2) ,  µ2 − 12 < x ≤ 24
                          

std=3.4,µ2=17.6

找到几个小时后,我得到了这个答案 1.获取0到1的随机数 2.计算cdf 3.计算逆cdf 4.获取随机数

但我不知道如何在 python 中实现它。

【问题讨论】:

  • 看起来您正在处理两个截断的正态分布。可以看random.gauss;要反转 cdf,您可能需要查看 scipy

标签: python numpy scipy statistics


【解决方案1】:

您可以使用scipy.stats.rv_continuous 作为基类来创建自己的发行版。鉴于分布的 PDF,此类具有 CDF、随机数生成器、SF、ISF 等的快速默认实现。您可以使用以下方式实现自己的分发:

import numpy as np
from numpy import exp
from scipy.stats import rv_continuous

class my_distribution_gen(rv_continuous):
    def _logpdf(self, x, mu, std):
        # code the log of your pdf function here
        result = # here goes your equation
        return result

    def _pdf(self, x, mu, std):
        return exp(self._logpdf(x, mu, std))

my_distribution = my_distribution_gen(name='my_distribution')

一旦您准备好上述类,您就可以通过调用rvscdf 等方法来享受默认实现。

mu, std = 0, 1
rvs = my_distribution.rvs(mu, std)

【讨论】: