Disons que j'ai besoin d'un numéro à 3 chiffres, donc ce serait quelque chose comme
>>> random(3)
563
or
>>> random(5)
26748
>> random(2)
56
Pour obtenir un nombre aléatoire à 3 chiffres:
from random import randint
randint(100, 999) # randint is inclusive at both ends
(en supposant que vous vouliez vraiment dire trois chiffres plutôt que "jusqu'à trois chiffres".)
Pour utiliser un nombre arbitraire de chiffres:
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)
Sortie:
33
124
5127
Si vous le souhaitez sous forme de chaîne (par exemple, un numéro de téléphone à 10 chiffres), vous pouvez utiliser ceci:
n = 10
''.join(["%s" % randint(0, 9) for num in range(0, n)])
Est-ce que 0 compte comme premier chiffre possible? Si tel est le cas, vous avez besoin de random.randint(0,10**n-1)
. Sinon, random.randint(10**(n-1),10**n-1)
. Et si zéro est jamais autorisé, vous devrez alors rejeter explicitement les nombres avec un zéro ou dessiner des nombres n
random.randint(1,9)
.
De plus, il est intéressant de noter que randint(a,b)
utilise une "indexation" quelque peu non-Pythonic pour obtenir un nombre aléatoire a <= n <= b
. On aurait pu s’attendre à ce que cela fonctionne comme range
et produire un nombre aléatoire a <= n < b
. (Notez l'intervalle supérieur fermé.)
Étant donné les réponses dans les commentaires sur randrange
, notez qu’elles peuvent être remplacées par les nettoyeurs random.randrange(0,10**n)
, random.randrange(10**(n-1),10**n)
et random.randrange(1,10)
.
Si vous avez besoin d'un numéro à 3 chiffres et que vous voulez que 001-099 soit un nombre valide, vous devez quand même utiliser randrange/randint car il est plus rapide que les alternatives. Il suffit d’ajouter les zéros précédents lors de la conversion en chaîne.
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)
Alternativement, si vous ne voulez pas enregistrer le nombre aléatoire en tant qu'int, vous pouvez simplement le faire en tant qu'élément unique:
'{:03}'.format(random.randrange(1, 10**3))
python 3.6+ seulement oneliner:
f'{random.randrange(1, 10**3):03}'
Voici des exemples de résultats de ce qui précède:
Vous pourriez écrire vous-même une petite fonction pour faire ce que vous voulez:
import random
def randomDigits(digits):
lower = 10**(digits-1)
upper = 10**digits - 1
return random.randint(lower, upper)
Fondamentalement, 10**(digits-1)
vous donne le plus petit numéro de chiffre {digit}, et 10**digits - 1
vous donne le plus grand numéro de chiffre {digit} (qui se trouve être le plus petit numéro de {chiffre + 1} moins moins 1!). Ensuite, nous prenons simplement un entier aléatoire de cette plage.
Si vous ne voulez pas mémoriser toutes les différentes commandes apparemment aléatoires (comme moi), vous pouvez toujours utiliser:
import random
Numbers = range(1, 10)
RandomNumber = random.choice(Numbers)
print(RandomNumber)
#returns a number
D'après la documentation officielle , ne semble-t-il pas que la méthode sample () est appropriée à cette fin?
import random
def random_digits(n):
num = range(0, 10)
lst = random.sample(num, n)
print str(lst).strip('[]')
Sortie:
>>>random_digits(5)
2, 5, 1, 0, 4
J'ai vraiment aimé la réponse de RichieHindle, mais j'ai aimé la question comme exercice. Voici une implémentation en force brute utilisant des chaînes :)
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)
Vous pouvez créer une fonction qui consomme une liste d'int, transforme une chaîne pour concaténer et transforme à nouveau do int, quelque chose comme ceci:
import random
def generate_random_number(length):
return int(''.join([str(random.randint(0,10)) for _ in range(length)]))