【问题标题】:What is the difference between uniform() and triangular()?统一()和三角形()有什么区别?
【发布时间】:2023-04-10 13:43:02
【问题描述】:

据我了解,random 模块有一组方法,其中 uniform() 和 triangular() 都返回两个给定参数之间的随机浮点数。他们之间没有区别吗?是否有任何特定情况下我们应该使用一个而不是另一个?

【问题讨论】:

  • 如果你投掷一个骰子,你会使用均匀分布。每个结果 1 ... 6 具有相同的概率。如果你掷一对骰子,你使用的是三角形分布。 2 (1 + 1) 和 12 (6 + 6) 的概率远低于 7 (1 + 6, 2 + 5, 3 + 4, 4 + 3, 5 + 2, 6 + 1)。

标签: python python-3.x random methods floating-point


【解决方案1】:

文档

Documentation是你的朋友

random.uniform(a, b) 返回一个随机浮点数 N,使得 a

端点值 b 可能包含在范围内,也可能不包含在范围内,具体取决于等式 a + (b-a) * random() 中的浮点舍入。

random.triangular(低,高,模式) 返回一个随机浮点数 N 使得 low


区别

所以random.triangular 模拟了一个triangular distribution,它与uniform distribution 非常相似。

方法使用的主要区别在于random.triangularmode 参数,它提供了对分布的更精细级别的控制。

对于常规的Uni(a,b) 分发,您可能应该使用random.uniform。根据 Wiki,即使模式设置为 0,三角分布 也不 与均匀分布相同

a = 0、b = 1 和 c = 0 的分布是 X = |X1 − X2| 的分布,其中 X1、X2 是两个具有标准均匀分布的独立随机变量。

所以random.triangular 应该精确地用于使用三角分布。


示例

这是一个简单的例子,突出了两种方法的差异/相似之处

import random


# Set Seed for reproducibility
random.seed(123)

# Parameters
lo: int = 0
hi: int = 100
mode: int = 10
sample_size: int = int(1e+6)

# Samples
uni = (random.uniform(lo, hi) for _ in range(sample_size))
tri1 = (random.triangular(lo, hi, mode) for _ in range(sample_size))
tri2 = (random.triangular(lo, hi) for _ in range(sample_size))


# Printing averages
print(round(sum(uni) / sample_size, 2))
# 50.01
print(round(sum(tri1) / sample_size, 2))
# 36.68
print(round(sum(tri2) / sample_size, 2))
# 50.0

【讨论】:

    猜你喜欢
    • 2013-08-31
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 2011-03-23
    • 1970-01-01
    • 2017-06-27
    • 2011-04-16
    相关资源
    最近更新 更多