web-dev-qa-db-fra.com

Comment générer un nombre aléatoire avec la longueur spécifique en python

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
73
Arty

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
136
RichieHindle

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)])
22
osman

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 nrandom.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).

5
Andrew Jaffe

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:

  • '026'
  • '255' 
  • '512'
3
Brian

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.

3
Daniel G

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
2
Matthew Miles

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
0
kerwei

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)
0
moldovean

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)]))
0
Andre Machado