gpt4 book ai didi

python - 三角分布随机变量

转载 作者:行者123 更新时间:2023-12-04 09:14:57 26 4
gpt4 key购买 nike

首先介绍一下我的情况:
我需要一个随机三角形分布,并计划使用 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.triangular使用一个随机数,而特殊情况代码使用2个随机数。特殊情况结​​果的随机性是否会显着降低,因为它们使用 2 次连续调用 random,而 random.triangular 仅使用一次?使用简化代码是否还有其他不可预见的副作用?
编辑:引用 this solution to a different question ,我为这两种分布创建了直方图,表明它们具有可比性:
随机三角分布:
Random Triangular Distribution
特例简化分布:
Special Case Simplified Distribution

最佳答案

在您的情况下,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,则强烈表明这些数字来自错误的分布。)

关于python - 三角分布随机变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63272587/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com