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
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:
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
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)])
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:
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_}}'
¿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 range
y 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)
.
a <= n <= b
también me sorprendió. Me molesta tener que poner ese extra -1
en mi código. :-)
randint
(está en Lib / random.py) en realidad solo llama randrange(a, b+1)
!
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 - 1
le 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.
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)
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
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)]))