【问题标题】:Triangular Distribution Random Variables三角分布随机变量
【发布时间】:2020-08-05 19:51:10
【问题描述】:

首先介绍一下我的情况:

我需要一个随机三角分布,并计划使用 Python 的 random.triangular。以下为源码(Python 3.6.2):

    def triangular(self, low=0.0, high=1.0, mode=None):
    """Triangular distribution.

    Continuous distribution bounded by given lower and upper limits,
    and having a given mode value in-between.

    http://en.wikipedia.org/wiki/Triangular_distribution

    """
    u = self.random()
    try:
        c = 0.5 if mode is None else (mode - low) / (high - low)
    except ZeroDivisionError:
        return low
    if u > c:
        u = 1.0 - u
        c = 1.0 - c
        low, high = high, low
    return low + (high - low) * (u * c) ** 0.5

我查看了引用的 wiki 页面,发现我想要的用途有一个special case,它可以简化事情,并且可以使用以下函数实现:

def random_absolute_difference():
    return abs(random.random() - random.random())

做一些快速计时显示简化版本显着加速(每次我的代码运行时,此操作将重复超过一百万次):

>>> import timeit
>>> timeit.Timer('random.triangular(mode=0)','import random').timeit()
0.5533245000001443
>>> timeit.Timer('abs(random.random()-random.random())','import random').timeit()
0.16867640000009487

所以现在的问题是:我知道 python 的 random 模块只使用伪随机性,而 random.triangular 使用一个随机数,而特殊情况代码使用 2 个随机数。特殊情况结​​果的随机性是否会显着降低,因为它们使用了 2 次连续调用 random,而 random.triangular 只使用了一次?使用简化代码是否还有其他不可预见的副作用?

编辑:参考this solution to a different question,我为两种分布创建了直方图,表明它们具有可比性:

随机三角分布:

特殊情况简化分布:

【问题讨论】:

  • "特殊情况结​​果的随机性会显着降低吗,因为它们使用了 2 次对 random 的连续调用,而 random.triangular 只使用了一次?"输入上的更多随机位意味着输出通常会有更多的随机性,而不是更少

标签: python random distribution triangular


【解决方案1】:

在您的情况下,triangular 归结为以下表达式:

1 + (0 - 1) * ((1.0 - u) * (1.0 - c)) ** 0.5

然后进一步:

1 - 1 * ((1.0 - u) * 1.0) ** 0.5

然后进一步:

1 - (1.0 - u) ** 0.5

根据我的计时,最后一个表达式的运行速度比random.triangular(mode=0) 快得多,并且与abs(random.random()-random.random()) 的速度相当。请注意,triangular 包含一个 try/except 语句,它可以解释一些性能差异(例如,将该语句替换为 "mode = 0" 并查看)。

import timeit
timeit.Timer('random.triangular(mode=0)','import random').timeit()
timeit.Timer('1 - (1.0 - random.random()) ** 0.5','import random').timeit()
timeit.Timer('abs(random.random()-random.random())','import random').timeit()

但是,我看不出为什么使用两个随机数而不是一个会产生“较少随机”的三角分布数——只要这两种方法产生相同的分布。事实上,使用两个随机数会比单独使用一个随机数提供更多种类的三角形分布数,因为有更多位可用于此目的的随机性。 (如果您想测试这两种方法的正确性,您可以使用 Kolmogorov–Smirnov 测试以及三角形分布的 CDF,因为三角形分布是绝对连续的。例如,在 SciPy 中实现了此测试在scipy.stats.kstest 下。如果多次运行测试返回的 p 值非常接近 0,则强烈表明这些数字来自错误的分布。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-21
    • 2016-03-27
    • 2020-04-05
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多