Python 三角分布随机变量

Python 三角分布随机变量,python,random,distribution,triangular,Python,Random,Distribution,Triangular,首先介绍一下我的情况: 我需要一个随机的三角形分布,并计划使用Python的random.triangal。以下是源代码(Python 3.6.2): 我查看了被引用的wiki页面,发现我想要的用途有一个简化的功能,可以通过以下功能实现: def random_absolute_difference(): return abs(random.random() - random.random()) 通过快速计时,简化版的速度显著加快(每次代码运行时,此操作将重复一百万次以上): 现在来回

首先介绍一下我的情况:

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

我查看了被引用的wiki页面,发现我想要的用途有一个简化的功能,可以通过以下功能实现:

def random_absolute_difference():
    return abs(random.random() - random.random())
通过快速计时,简化版的速度显著加快(每次代码运行时,此操作将重复一百万次以上):


现在来回答这个问题:我知道python的随机模块只使用伪随机性,random.triangal使用一个随机数,而特例代码使用2个随机数。特殊情况下的结果是否会显著减少随机性,因为它们使用两个连续的随机调用,而random.Triangal只使用一个?使用简化代码是否还有其他不可预见的副作用

编辑:参考,我为这两种分布创建了柱状图,表明它们具有可比性:

随机三角分布:

特例简化分发:

在您的例子中,
三角形
归结为以下表达式:

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
然后进一步:

1 - 1 * ((1.0 - u) * 1.0) ** 0.5
1 - (1.0 - u) ** 0.5
根据我的计时,最后一个表达式的运行速度比
random.triangal(mode=0)
快得多,速度与
abs(random.random()-random.random())
相当。请注意,
triangal
包含一个try/except语句,它可能解释了一些性能差异(例如,将该语句替换为“mode=0”,请参阅)


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

另请参见:“特殊情况的结果是否会明显减少随机性,因为它们使用两个连续的随机调用,而random.Triangal只使用一个?”输入上的随机位越多,通常意味着输出的随机性越大,而不是越小
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()