Digamos que eu precise de um número de 3 dígitos, então seria algo como:
>>> random(3)
563
or
>>> random(5)
26748
>> random(2)
56
Para obter um número aleatório de 3 dígitos:
from random import randint
randint(100, 999) # randint is inclusive at both ends
(presumindo que você realmente quis dizer três dígitos, em vez de "até três dígitos".)
Para usar um número arbitrário 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)
Resultado:
33
124
5127
Se você quiser como uma string (por exemplo, um número de telefone de 10 dígitos), pode usar isto:
fonte
Se você precisa de um número de 3 dígitos e deseja que 001-099 sejam números válidos, você ainda deve usar randrange / randint, pois é mais rápido do que as alternativas. Basta adicionar os zeros precedentes necessários ao converter em uma string.
Alternativamente, se você não quiser salvar o número aleatório como um inteiro, você pode apenas fazer isso como um oneliner:
python 3.6+ somente oneliner:
Os exemplos de resultados acima são:
Implementado como uma função:
fonte
0 conta como um possível primeiro dígito? Se sim, então você precisa
random.randint(0,10**n-1)
. Se nãorandom.randint(10**(n-1),10**n-1)
,. E se zero nunca for permitido, você terá que rejeitar explicitamente os números com um zero ou desenharn
random.randint(1,9)
números.À parte: é interessante que
randint(a,b)
use uma "indexação" um tanto não pythônica para obter um número aleatórioa <= n <= b
. Seria de se esperar que funcionasserange
e produzisse um número aleatórioa <= n < b
. (Observe o intervalo superior fechado.)Dadas as respostas nos comentários sobre
randrange
, nota que estes podem ser substituídos com o aspiradorrandom.randrange(0,10**n)
,random.randrange(10**(n-1),10**n)
erandom.randrange(1,10)
.fonte
a <= n <= b
também me surpreendeu. Eu me ressinto por ter que colocar aquele extra-1
no meu código. :-)randint
(está em Lib / random.py) na verdade apenas chamarandrange(a, b+1)
!Você pode escrever uma pequena função para fazer o que quiser:
Basicamente,
10**(digits-1)
dá-lhe o menor número de {dígito} -digito e10**digits - 1
dá-lhe o maior número de {dígito} -digito (que passa a ser o menor número de {dígito + 1} -digito menos 1!). Então, pegamos um inteiro aleatório desse intervalo.fonte
Gostei muito da resposta de RichieHindle, porém gostei da pergunta como um exercício. Aqui está uma implementação de força bruta usando strings :)
fonte
A partir da documentação oficial , isso não parece que o método () da amostra é apropriada para este fim?
Resultado:
fonte
Você poderia criar uma função que consome uma lista de int, se transforma em string para concatenar e lançar do int novamente, algo assim:
fonte