代码之家  ›  专栏  ›  技术社区  ›  Puna

当使用random.uniform(a,b)时,b是包含的还是互斥的?

  •  1
  • Puna  · 技术社区  · 2 年前

    我在探索随机模块,找不到b在中是包含的还是排他的正确答案 random.uniform(a, b) .

    在类似的代码中 random.uniform(0, 1) ,一些回答说1被包括在内,而另一些回答说从来没有产生过1。正确答案是什么?

    3 回复  |  直到 2 年前
        1
  •  3
  •   Sash Sinha    2 年前

    的文档 random. uniform( a , b ) 表明您可能会遇到上限 b 由于浮点数的表示方式,包含在范围内,但不能保证:

    返回一个随机浮点数N,使得 a <= N <= b 对于 a <= b b <= N <= a 对于 b < a .

    终点值 b 可能包括也可能不包括在该范围内,这取决于公式中的浮点舍入 a + (b-a) * random() .

    所以有时候上限 b 可能包括在内,有时可能不包括在内。

        2
  •  2
  •   John Gordon    2 年前

    根据文件:

    返回随机浮点数N,使得<=N<=b表示a<=b和b<=N<=a表示b<一

    根据方程a+(b-a)*random()中的浮点舍入,端点值b可以包括在该范围内,也可以不包括在该区域内。

    如果您对函数的工作原理有疑问,最好从阅读文档开始。

        3
  •  0
  •   Kelly Bundy    2 年前

    这个 a + (b-a) * random() 文档中也是实际的实现(至少在CPython中是这样,我非常怀疑其他印象是否会偏离这一点,尤其是因为文档中已经说明了这一点)。

    random() 实现为:

    (int.from_bytes(_urandom(7)) >> 3) * 2**-53
    

    所以对于给定 a b ,您可以确定 b 包括:

    def inclusive(a, b):
        max_random = (int.from_bytes(bytes([255] * 7)) >> 3) * 2**-53
        max_uniform = a + (b-a) * max_random
        return max_uniform == b
    

    示例( Attempt This Online! ):

    a=1 b=1 inclusive(a,b)=True
    a=1 b=2 inclusive(a,b)=True
    a=1 b=3 inclusive(a,b)=True
    a=1 b=4 inclusive(a,b)=False
    a=1 b=5 inclusive(a,b)=True
    a=1 b=6 inclusive(a,b)=False
    a=1 b=7 inclusive(a,b)=False
    a=1 b=8 inclusive(a,b)=False
    a=1 b=9 inclusive(a,b)=True
    a=1 b=10 inclusive(a,b)=False