sacar - Cómo generar un número aleatorio con la longitud específica en python
lista de numero aleatorios python (9)
¿0 cuenta como un primer dígito posible? Si es así, entonces necesitas random.randint(0,10**n-1)
. Si no, random.randint(10**(n-1),10**n-1)
. Y si cero nunca está permitido, entonces tendrá que rechazar explícitamente números con un cero en ellos, o dibujar n
random.randint(1,9)
.
Aparte: es interesante que randint(a,b)
utilice una "indexación" no pythonic para obtener un número aleatorio a <= n <= b
. Uno podría haber esperado que funcionara como range
, y producir un número aleatorio a <= n < b
. (Tenga en cuenta el intervalo superior cerrado.)
Dadas las respuestas en los comentarios sobre randrange
, tenga en cuenta que estos pueden ser reemplazados por los random.randrange(0,10**n)
, random.randrange(10**(n-1),10**n)
y random.randrange(1,10)
.
Digamos que necesito un número de 3 dígitos, por lo que sería algo así como:
>>> random(3)
563
or
>>> random(5)
26748
>> random(2)
56
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
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 quiso decir 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
Puede crear una función que consuma una lista de int, transforma en 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)]))
Puedes 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 más pequeño de {dígitos} -dígitos, y 10**digits - 1
le da el número más grande de {dígitos} -dígitos (que es el más pequeño {dígito + 1} -número de dígitos menos 1!). Entonces tomamos un entero aleatorio de ese rango.
Realmente me gustó 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)
Si lo quiere como una cadena (por ejemplo, un número de teléfono de 10 dígitos) puede usar esto:
n = 10
''''.join(["%s" % 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 precedentes necesarios al convertir a una cadena.
import random
num = random.randrange(1, 10**3)
num_with_zeros = ''{:03}''.format(num)
Alternativamente, si no quiere guardar el número aleatorio como un int, puede hacerlo como un oneliner:
''{:03}''.format(random.randrange(1, 10**3))
Python 3.6+ only oneliner:
f''{random.randrange(1, 10**3):03}''
Ejemplos de salidas de lo anterior son:
- ''026''
- ''255''
- ''512''
Si no quieres memorizar todos los diferentes comandos aparentemente aleatorios (como yo), siempre puedes usar:
import random
Numbers = range(1, 10)
RandomNumber = random.choice(Numbers)
print(RandomNumber)
#returns a number