Cómo generar un número aleatorio con la longitud específica en Python


105

Digamos que necesito un número de 3 dígitos, por lo que sería algo como:

>>> random(3)
563

or

>>> random(5)
26748
>> random(2)
56

Respuestas:


182

Para obtener un número aleatorio de 3 dígitos:

from random import randint
randint(100, 999)  # randint is inclusive at both ends

(suponiendo que realmente te refieres a tres dígitos, en lugar de "hasta tres dígitos").

Para usar una cantidad arbitraria de dígitos:

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(2)
print random_with_N_digits(3)
print random_with_N_digits(4)

Salida:

33
124
5127

7
Con esta solución, eliminará 10 ** (n-1) números de su grupo aleatorio
— Nicu Surdu

5
@NicolaeSurdu: Sí, por eso dije asumiendo que realmente te referías a tres dígitos, en lugar de "hasta tres dígitos".
— RichieHindle

3
037 es un número de 3 dígitos, menor que 100 :). A eso me refería. Pero sí, para una aplicación que no sea de lotería, su solución está bien;)
— Nicu Surdu

@NicolaeSurdu ¿Cómo puede este snipet darte un resultado de 037 ??? es un randint de (100 a 1000) si n == 3
— Moldovean

3
@moldovean Leer desde arriba :). Quise decir que quería ese número y esta solución no le dará números hasta ese número de dígitos, sino exactamente ese número de dígitos. Fue mi culpa, me perdí la cláusula entre paréntesis.
— Nicu Surdu

41

Si lo desea como una cadena (por ejemplo, un número de teléfono de 10 dígitos) puede usar esto:

n = 10
''.join(["{}".format(randint(0, 9)) for num in range(0, n)])

'' .join (str (randint (0, 9)) para _ en el rango (n))
— Mike Fogel

13

Si necesita un número de 3 dígitos y desea que 001-099 sean números válidos, debe usar randrange / randint, ya que es más rápido que las alternativas. Simplemente agregue los ceros anteriores necesarios al convertir a una cadena.

import random
num = random.randrange(1, 10**3)
# using format
num_with_zeros = '{:03}'.format(num)
# using string's zfill
num_with_zeros = str(num).zfill(3)

Alternativamente, si no desea guardar el número aleatorio como un int, puede hacerlo como un delineador:

'{:03}'.format(random.randrange(1, 10**3))

python 3.6+ solo en un delineador:

f'{random.randrange(1, 10**3):03}'

Los resultados de ejemplo de lo anterior son:

  • '026'
  • '255'
  • '512'

Implementado como función:

import random

def n_len_rand(len_, floor=1):
    top = 10**len_
    if floor > top:
        raise ValueError(f"Floor {floor} must be less than requested top {top}")
    return f'{random.randrange(floor, top):0{len_}}'

5

¿Cuenta 0 como posible primer dígito? Si es así, entonces necesitas random.randint(0,10**n-1). Si no es así, random.randint(10**(n-1),10**n-1). Y si nunca se permite el cero , entonces tendrá que rechazar explícitamente los números con un cero o sacar n random.randint(1,9)números.

Aparte: es interesante que randint(a,b)utiliza una "indexación" algo no pitónica para obtener un número aleatorio a <= n <= b. Uno podría haber esperado que funcionara rangey produjera un número aleatorio a <= n < b. (Tenga en cuenta el intervalo superior cerrado).

Dadas las respuestas en los comentarios acerca randrange, nota que estos pueden ser reemplazados con el limpiador random.randrange(0,10**n), random.randrange(10**(n-1),10**n)y random.randrange(1,10).


@Andrew: a <= n <= btambién me sorprendió. Me molesta tener que poner ese extra -1en mi código. :-)
— RichieHindle

1
@Andrew: curiosamente, ¡el código Python para randint(está en Lib / random.py) en realidad solo llama randrange(a, b+1)!
— Daniel G

4

Podrías escribir una pequeña función para hacer lo que quieras:

import random
def randomDigits(digits):
    lower = 10**(digits-1)
    upper = 10**digits - 1
    return random.randint(lower, upper)

Básicamente, 10**(digits-1)le da el número de {dígito} -dígito más pequeño y 10**digits - 1le da el número de {dígito} -dígito más grande (que resulta ser el número de {dígito + 1} dígito más pequeño menos 1!). Luego tomamos un número entero aleatorio de ese rango.


0

Me gustó mucho la respuesta de RichieHindle, sin embargo me gustó la pregunta como ejercicio. Aquí hay una implementación de fuerza bruta usando cadenas :)

import random
first = random.randint(1,9)
first = str(first)
n = 5

nrs = [str(random.randrange(10)) for i in range(n-1)]
for i in range(len(nrs))    :
    first += str(nrs[i])

print str(first)

0

De la documentación oficial , ¿no parece que el método sample () es apropiado para este propósito?

import random

def random_digits(n):
    num = range(0, 10)
    lst = random.sample(num, n)
    print str(lst).strip('[]')

Salida:

>>>random_digits(5)
2, 5, 1, 0, 4

0

Podría crear una función que consuma una lista de int, se transforme en una cadena para concatenar y lanzar do int nuevamente, algo como esto:

import random

def generate_random_number(length):
    return int(''.join([str(random.randint(0,10)) for _ in range(length)]))

no genera números de una longitud particular :(
— Prometheus
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.