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
Pretensioso
fuente

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
RichieHindle
fuente
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)])
osman
fuente
'' .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_}}'
Brian
fuente
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 Jaffe
fuente
@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.

Daniel G
fuente
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)
moldavo
fuente
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
kerwei
fuente
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)]))
André Machado
fuente
no genera números de una longitud particular :(
Prometheus