2010-08-22 20 views
29

La única diferencia que yo sepa entre randrange y randint es que randrange([start], stop[, step]) puede utilizar el paso y random.randrange(0,1) no tendrá en cuenta el último elemento, mientras que randint(0,1) devuelve un integrador elección del último elemento.Diferencia entre randint aleatoria vs randrange

Por lo tanto, no puedo encontrar una razón para explicar por qué randrange(0,1) no devuelve 0 o 1, ¿por qué existir randint(0, 1) y randrange(0, 2) en lugar de un randrange(0, 1) que devuelve 0 o 1?

+0

Relacionados: http://stackoverflow.com/questions/2568783/python-why-does-random-randinta-b-return-a-range-inclusive-of-b/2568917#2568917 – kennytm

+0

Tiene dos valores que quiero regresar y 2-0 = 2 (2 no incluidos en el rango). el recuento de rango (a, b) siempre es ba y, a menudo, la forma más clara de escribir el rango es el rango (a, a + recuento) –

Respuesta

35

Los documentos sobre randrange dicen:

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

devolver un elemento seleccionado al azar de range(start, stop, step). Esto es equivalente a 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 recuento basadas en cero y range(n) deberían devolver n elementos, supongo. Lo más útil para obtener un índice aleatorio, supongo.

Mientras randint se documenta como:

random.randint(a, b)

devolver un entero aleatorio N tal que a <= N <= b. alias para randrange(a, b+1)

Así randint es para cuando se tiene el valor máximo y mínimo para el número aleatorio que desee.

+3

[Los documentos] (http://docs.python.org/library/random.html) no parece decir nada sobre 'randint' que es un alias para' randrange (a, b + 1) '. ¿Es este realmente el caso? ¿Debería usarse este último en lugar de 'randint' para ver cómo será lo mismo debajo del capó? ¿Hay un gasto extra en llamar a 'randint'? – Whymarrh

+0

@Whymarrh Esta publicación tiene dos años de retraso. Tampoco pude encontrar el fragmento de texto que cité, pero estoy bastante seguro de que no lo inventé.En cuanto a elegir entre los dos, 'randint' es más simple e intuitivo, por lo tanto, lo recomendaría cada vez que se aplica. No creo que haya una diferencia de rendimiento mensurable, y me opongo firmemente a preocuparme por estas cosas. Usa lo que sea más claro. Si una sola llamada de función adicional lo perjudicaría, no debería usar Python. O la mayoría de las bibliotecas en cualquier idioma, para el caso. – delnan

+0

No quise dar a entender que la declaración fue inventada. Soy nuevo en el idioma y soy simplemente curioso. (Supongo que los documentos también han cambiado en dos años). Gracias por su respuesta, 'randint' es más claro y tiene más sentido de forma intuitiva. – Whymarrh

2

La diferencia entre los dos es que randint sólo se puede utilizar cuando se sabe ambos límites del 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á. Trate ejecute el código siguiente 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 de randint. Verás que recibirás un mensaje de error.

Cuestiones relacionadas