三角分布随机变量

利兰·赫普沃思

首先了解我的情况:

我需要一个随机的三角形分布,并且正在计划使用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页面,发现我想要的用途有一种特殊情况,可以简化事情,并且可以使用以下功能实现:

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仅使用1个连续调用而显着降低随机性?使用简化代码还有其他无法预料的副作用吗?

编辑:参考此解决方案的另一个问题,我为两个分布创建了直方图,显示了它们的可比性:

随机三角分布: 随机三角分布

特例简化分发: 特例简化发行

彼得·O

您的情况可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

And with my timings, this last expression runs much faster than random.triangular(mode=0) and has comparable speed to abs(random.random()-random.random()). Note that triangular contains a try/except statement, which may explain some of the performance difference (for example, replace that statement with just "mode = 0" and see).

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,则表明该数字来自错误的分布。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

来自三角分布的随机样本:R

来自分类Dev

计算两个三角形随机变量的总和(Matlab)

来自分类Dev

从正态分布中选择的随机变量的出现概率

来自分类Dev

用Matlab创建均匀分布的随机变量

来自分类Dev

使用逆采样从分布函数生成随机变量

来自分类Dev

根据概率分布生成随机变量

来自分类Dev

生成对数正态分布的随机变量

来自分类Dev

Nginx随机变量

来自分类Dev

用Python中的三角分布进行Monte Carlo模拟

来自分类Dev

跨行 CSV 成本数据的蒙特卡罗模拟(三角分布)

来自分类Dev

当参数本身是随机变量时,绘制正态分布

来自分类Dev

计算对数正态分布随机变量的预期收益

来自分类Dev

模拟R中正态分布随机变量的平均值

来自分类Dev

如何从不同大小的概率分布中采样随机变量

来自分类Dev

如何在python中生成独立的均匀分布(iid)随机变量

来自分类Dev

从密度函数生成随机变量

来自分类Dev

Java指向随机变量

来自分类Dev

在Ruby中同步随机变量

来自分类Dev

从密度函数生成随机变量

来自分类Dev

递归生成指数随机变量

来自分类Dev

在列表中选择随机变量

来自分类Dev

Jmeter-随机变量集

来自分类Dev

对象类和随机变量

来自分类Dev

限制PyMC中的随机变量

来自分类Dev

返回随机变量数据的javascript

来自分类Dev

PHP:(不是这样)随机变量

来自分类Dev

使用PyMC估算随机变量的参数,该参数是均匀随机变量的总和

来自分类Dev

如何使用正态分布误差和均匀分布的随机变量在R中制作回归线

来自分类Dev

给定变量的均匀分布,请使用随机变量函数绘制概率密度函数MATLAB