Python: ¿Cómo generar un número aleatorio de 12 dígitos?

En Python, ¿cómo generar un número aleatorio de 12 dígitos? ¿Hay alguna función en la que podamos especificar un rango como random.range(12) ?

 import random random.randint() 

La salida debe ser una cadena con 12 dígitos en el rango 0-9 (ceros iniciales permitidos).

¿Qué hay de malo con un enfoque directo?

 >>> import random >>> random.randint(100000000000,999999999999) 544234865004L 

Y si lo quieres con ceros iniciales, necesitas una cadena.

 >>> "%0.12d" % random.randint(0,999999999999) '023432326286' 

Editar:

Mi propia solución a este problema sería algo como esto:

 import random def rand_x_digit_num(x, leading_zeroes=True): """Return an X digit number, leading_zeroes returns a string, otherwise int""" if not leading_zeroes: # wrap with str() for uniform results return random.randint(10**(x-1), 10**x-1) else: if x > 6000: return ''.join([str(random.randint(0, 9)) for i in xrange(x)]) else: return '{0:0{x}d}'.format(random.randint(0, 10**x-1), x=x) 

Resultados de la prueba:

 >>> rand_x_digit_num(5) '97225' >>> rand_x_digit_num(5, False) 15470 >>> rand_x_digit_num(10) '8273890244' >>> rand_x_digit_num(10) '0019234207' >>> rand_x_digit_num(10, False) 9140630927L 

Métodos de tiempo para la velocidad:

 def timer(x): s1 = datetime.now() a = ''.join([str(random.randint(0, 9)) for i in xrange(x)]) e1 = datetime.now() s2 = datetime.now() b = str("%0." + str(x) + "d") % random.randint(0, 10**x-1) e2 = datetime.now() print "a took %s, b took %s" % (e1-s1, e2-s2) 

Resultados de la prueba de velocidad:

 >>> timer(1000) a took 0:00:00.002000, b took 0:00:00 >>> timer(10000) a took 0:00:00.021000, b took 0:00:00.064000 >>> timer(100000) a took 0:00:00.409000, b took 0:00:04.643000 >>> timer(6000) a took 0:00:00.013000, b took 0:00:00.012000 >>> timer(2000) a took 0:00:00.004000, b took 0:00:00.001000 

Lo que nos dice:

Para cualquier dígito de menos de 6000 caracteres de longitud, mi método es más rápido, a veces MUCHO más rápido, pero para números más grandes, el método sugerido por arshajii se ve mejor.

Hacer random.randrange(10**11, 10**12) . Funciona como randint cumple range

De la documentación:

 randrange(self, start, stop=None, step=1, int=, default=None, maxwidth=9007199254740992L) method of random.Random instance Choose a random item from range(start, stop[, step]). This fixes the problem with randint() which includes the endpoint; in Python this is usually not what you want. Do not supply the 'int', 'default', and 'maxwidth' arguments. 

Esto es efectivamente como hacer una random.choice(range(10**11, 10**12)) o random.randint(10**1, 10**12-1) . Dado que se ajusta a la misma syntax que range() , es mucho más intuitivo y limpio que estas dos alternativas.

Si se permiten ceros iniciales:

 "%012d" %random.randrange(10**12) 

Hay muchas maneras de hacer eso:

 import random rnumber1 = random.randint(10**11, 10**12-1) # randint includes endpoint rnumber2 = random.randrange(10**11, 10**12) # randrange does not # useful if you want to generate some random string from your choice of characters digits = "123456789" digits_with_zero = digits + "0" rnumber3 = random.choice(digits) + ''.join(random.choice(digits_with_zero) for _ in range(11)) 

Ya que los ceros iniciales están permitidos (por tu comentario), también puedes usar:

 int(''.join(str(random.randint(0,9)) for _ in xrange(12))) 

EDIT : Por supuesto, si desea una cadena , puede simplemente omitir la parte int :

 ''.join(str(random.randint(0,9)) for _ in xrange(12)) 

Esta parece ser la forma más sencilla de hacerlo en mi opinión.

 from random import randint def random_with_N_digits(n): range_start = 10**(n-1) range_end = (10**n)-1 return randint(range_start, range_end) print random_with_N_digits(12) 

Puede que esto no sea exactamente lo que estás buscando, pero una biblioteca como rstr te permite generar cadenas aleatorias. Con eso todo lo que necesitarías es (liderando 0 permitido):

 import rstr foo = rstr.digits(12)