【发布时间】: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