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

随机随机随机数与随机数之差

  •  35
  • killown  · 技术社区  · 14 年前

    我知道的唯一区别是 randrange randint 那是 randrange([start], stop[, step]) 您可以使用步骤和 random.randrange(0,1) 不会考虑最后一项,而 randint(0,1) 返回包含最后一项的选项。

    所以,我找不到解释原因 randrange(0,1) 不返回0或1,为什么存在 randint(0, 1) randrange(0, 2) 而不是 randrange(0, 1) 谁返回0或1?

    5 回复  |  直到 5 年前
        1
  •  40
  •   Georgy rassa45    6 年前

    这个 docs on randrange 说:

    random.randrange([start], stop[, step])

    返回从中随机选择的元素 range(start, stop, step) . 这相当于 choice(range(start, stop, step)) ,但实际上不构建范围对象。

    range(start, stop) 收益率 [start, start+step, ..., stop-1] 不是 [start, start+step, ..., stop] . 至于为什么…基于零的计数规则和 range(n) 应该返回 n 我想是元素吧。我想对于获取随机索引最有用。

    同时 randint is documented as :

    random.randint(a, b)

    返回一个随机整数n,以便 a <= N <= b . Alias randrange(a, b+1)

    所以 兰登 当您拥有所需随机数的最大值和最小值时。

        2
  •  22
  •   Veedrac    7 年前

    https://github.com/python/cpython/blob/.../Lib/random.py#L218

        def randint(self, a, b):
            """Return random integer in range [a, b], including both end points.
            """
    
            return self.randrange(a, b+1)
    
        3
  •  2
  •   C R Rob Cowie    10 年前

    他们之间的区别是 randint 只能在知道两个间隔限制时使用。 如果你只知道间隔的第一个极限 兰登 将返回错误。在这种情况下,您可以使用 randrange 只有一个时间间隔,它就可以工作了。 尝试运行以下代码以用随机三角形填充屏幕:

    import random
    from tkinter import *
    
    tk = Tk()
    canvas = Canvas(tk, width=400, height=400)
    canvas.pack()
    
    def random_triangle(l1,l2,l3,l4,l5,l6):
      x1 = random.randrange(l1)
      y1 = random.randrange(l2)
      x2 = x1 + random.randrange(l3)
      y2 = y1 + random.randrange(l4)
      x3 = x2 + random.randrange(l5)
      y3 = y2 + random.randrange(l6)
      canvas.create_polygon(x1,y1,x2,y2,x3,y3)
    
    for x in range(0, 100):
      random_triangle(300,400,200,500,400,100)
    

    尝试再次运行上面的代码 兰登 功能。您将看到您将收到一条错误消息。

        4
  •  0
  •   James Lawson    6 年前

    范围 在python中,包含了下界,但是 不包括上限 . 起初,这可能看起来很混乱,但它是故意的,并且在整个Python中都使用。

    list(range(4, 10))
    #     [4, 5, 6, 7, 8, 9]
    #     does not include 10!
    
    xs = ['a', 'b', 'c', 'd', 'e']  
    xs[1:4]  
    #     [xs[1], xs[2], xs[3]] 
    #     does not include xs[4]!
    
    bisect.bisect_left('jack', names, 2, 5)
    #     perform a binary search on names[2], names[3], names[4]
    #     does not include names[5]!
    
    random.randrange(4, 8)
    #     picks a random number from 4, 5, 6, 7
    #     does not include 8!
    

    在数学中,这被称为 half-open interval . python选择使用半间隔,因为它们避免 off-by-one errors :

    [避免一个错误关闭]…计算中的范围通常用 半开放式间隔 ;m到n(含)的范围由m(含)到n+1(不含)的范围表示。

    因此,大多数python库函数都会使用这种思想 在可能的情况下,半开范围。

    然而 兰登 就是那个 使用半开放式间隔。

    random.randint(4, 8)
    #     picks a random number from 4, 5, 6, 7, 8
    #     it does indeed include 8!
    

    原因是历史:

    • 兰登 早在年就加入了 v1.5 大约在1998年,这个函数名被用来随机生成浮点数和 integers 随机
    • 兰德兰 是在1.5.2版的python中添加的。在 v2.0 ,添加了一个通知,说明randint是 贬低 .
    • Randint的折旧通知已被删除。

    randint开始时是一个早期的库函数,它不包括半开放时间间隔,因为这个思想当时在python中的巩固程度较低。

        5
  •  0
  •   Anonymous    5 年前

    事实上。。。 randint() 使用 randrange() 生成随机整数。

    >>> randint(1.0,2.1)
    Traceback (most recent call last):
      File "<pyshell#5>", line 1, in <module>
        randint(1.0,2.1)
      File "C:\Users\Anonymous\AppData\Local\Programs\Python\Python37\lib\random.py", line 222, in randint
        return self.randrange(a, b+1) <----- LOOK HERE
      File "C:\Users\Anonymous\AppData\Local\Programs\Python\Python37\lib\random.py", line 195, in randrange
        raise ValueError("non-integer stop for randrange()")
    ValueError: non-integer stop for randrange()