【问题标题】:Random numbers that follow a linear drop distribution in PythonPython中遵循线性下降分布的随机数
【发布时间】:2015-07-01 18:22:58
【问题描述】:

我想生成遵循下降线性频率分布的随机数,以 n=1-x 为例。

然而,numpy 库似乎只提供更复杂的分布。

【问题讨论】:

  • 欢迎来到 SO Martin!社区很乐意帮助您解决在处理问题时遇到的编码问题。但是,您需要提供您编写的代码和遇到的问题。通常,我们不会为您编写。
  • 问题太根本了,我什至无法开始编码。

标签: python random frequency-distribution


【解决方案1】:

所以,事实证明你完全可以使用random.triangular(0,1,0)。请参阅此处的文档:https://docs.python.org/2/library/random.html

random.triangular(low, high, mode)

返回一个随机浮点数 N,使得低

matplotlib制作的直方图:

import matplotlib.pyplot as plt
import random
bins = [0.1 * i for i in range(12)]
plt.hist([random.triangular(0,1,0) for i in range(2500)], bins)

【讨论】:

    【解决方案2】:

    对于具有密度的非规范化 PDF

    1-x, in the range [0...1)
    

    归一化常数为 1/2

    CDF 等于2x-x^2

    这样,采样就很明显了

    r = 1.0 - math.sqrt(random.random())
    

    示例程序产生了几乎相同的情节

    import math
    import random
    import matplotlib.pyplot as plt
    
    bins = [0.1 * i for i in range(12)]
    plt.hist([(1.0 - math.sqrt(random.random())) for k in range(10000)], bins)
    plt.show()
    

    更新

    让我们将S 表示为一个积分,而S_a^b 是从ab 的定积分。

    所以

    Denormalized PDF(x) = 1-x
    

    归一化:

    N = S_0^1 (1-x) dx = 1/2
    

    因此,标准化的 PDF

    PDF(x) = 2*(1-x)
    

    让我们计算 CDF

    CDF(x) = S_0^x PDF(x) dx = 2x - x*x
    

    检查:CDF(0) = 0CDF(1) = 1

    采样是通过逆 CDF 方法,通过求解 x

    CDF(x) = U(0,1)
    

    U(0,1) 在 [0,1) 中是均匀随机的

    这是一个有解的简单二次方程

    x = 1 - sqrt(1 - U(0,1)) = 1 - sqrt(U(0,1))
    

    直接翻译成 Python 代码

    【讨论】:

    • 你能解释一下如何获取公式吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    相关资源
    最近更新 更多