randint number how python

python - number - Diferencia entre randint aleatorio vs randrange



random.randint python (4)

La única diferencia que conozco entre randrange y randint es que randrange([start], stop[, step]) puede usar el paso y random.randrange(0,1) no considerará el último elemento, mientras que randint(0,1) devuelve una opción que incluye el último artículo.

Entonces, no puedo encontrar una razón para explicar por qué randrange(0,1) no devuelve 0 o 1, por qué existen randint(0, 1) y randrange(0, 2) lugar de un randrange(0, 1) ¿Quién devuelve 0 o 1?


La diferencia entre los dos es que randint solo se puede usar cuando conoces ambos límites de intervalo. Si solo conoce el primer límite del intervalo, randint devolverá un error. En este caso, puede usar randrange con solo un intervalo y funcionará. Intenta ejecutar el siguiente código para llenar la pantalla con triángulos aleatorios:

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)

Intente ejecutar de nuevo el código anterior con la función randint . Verá que recibirá un mensaje de error.


Los documentos en randrange dicen:

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

Devuelve un elemento seleccionado aleatoriamente desde el range(start, stop, step) . Esto es equivalente a la choice(range(start, stop, step)) , pero en realidad no crea un objeto de rango.

Y el rango (inicio, parada) devuelve [start, start+step, ..., stop-1] , no [start, start+step, ..., stop] . En cuanto a por qué ... las reglas de conteo basadas en cero y el range(n) deberían devolver n elementos, supongo. La más útil para obtener un índice aleatorio, supongo.

Mientras que randint se documenta como:

random.randint(a, b)

Devuelve un entero aleatorio N tal que a <= N <= b . Alias ​​para randrange(a, b+1)

Entonces, randint es para cuando tiene el valor máximo y mínimo para el número aleatorio que desea.


Un rango en python es algo que incluye el límite inferior pero no incluye el límite superior . Al principio, esto puede parecer confuso, pero es intencional y se utiliza en todo 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!

En matemáticas, esto se llama un intervalo medio abierto . Python elige usar medios intervalos porque evitan errores off-by-one :

[para evitar errores off-by-one] ... los rangos en la computación a menudo se representan en intervalos medio abiertos ; el rango de m a n (inclusive) se representa por el rango de m (inclusive) a n + 1 (exclusivo)

Y así, como resultado, la mayoría de las funciones de la biblioteca de Python utilizarán esta idea de rangos medio abiertos cuando sea posible.

Sin embargo, randint es uno que no utiliza intervalos medio abiertos.

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

La razón es histórica:

  • randint se agregó al principio de la v1.5 circa 1998 y este nombre de función se utilizó para generar números de punto flotante aleatorios al azar y integers al azar
  • randrange se agregó en python en v1.5.2. En v2.0 , se agregó un aviso diciendo que randint está en desuso .
  • el aviso de desaprobación de randint ya ha sido eliminado

randint comenzó como una función de biblioteca anterior que no incluía un intervalo medio abierto porque esta idea estaba menos consolidada en Python en ese momento.