1688 votes

Génération de la chaîne aléatoire avec des majuscules et des chiffres en Python

Je veux générer une chaîne de taille N.

Il devrait être composé de chiffres et de majuscules anglais tels que :

  • 6U1S75
  • 4Z4UKK
  • U911K4

Comment puis-je y parvenir dans un Pythonique façon ?

3138voto

Ignacio Vazquez-Abrams Points 312628

Réponse en une seule ligne:

''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))

Dans les détails, avec une nouvelle fonction pour réutilisation:

>>> import string
>>> import random
>>> def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
...    return ''.join(random.choice(chars) for _ in range(size))
...
>>> id_generator()
'G5G74W'
>>> id_generator(3, "6793YUIO")
'Y3U'

Comment ça fonctionne ?

Nous importons string, un module qui contient des séquences de la commune de caractères ASCII, et random, un module qui traite de la génération aléatoire.

string.ascii_uppercase + string.digits seulement concatène la liste des personnages représentant des majuscules ASCII les caractères et les chiffres:

>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.digits
'0123456789'
>>> string.ascii_uppercase + string.digits
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'

Ensuite, nous utilisons une compréhension de liste pour créer une liste de n éléments:

>>> range(4) # range create a list of 'n' numbers
[0, 1, 2, 3]
>>> ['elem' for _ in range(4)] # we use range to create 4 times 'elem'
['elem', 'elem', 'elem', 'elem']

Dans l'exemple ci-dessus, nous utilisons [ la création de la liste, mais nous ne sommes pas dans l' id_generator fonction si Python n'est pas de créer la liste dans la mémoire, mais génère les éléments à la volée, un par un (plus à ce sujet ici).

Au lieu de demander de créer des " n "fois la chaîne de caractères elem, nous allons demander à Python pour créer des" n " fois, un caractère aléatoire, choisi à partir d'une séquence de caractères:

>>> random.choice("abcde")
'a'
>>> random.choice("abcde")
'd'
>>> random.choice("abcde")
'b'

Par conséquent, random.choice(chars) for _ in range(size) est vraiment de créer une séquence de size caractères. Les caractères qui sont choisis au hasard à partir d' chars:

>>> [random.choice('abcde') for _ in range(3)]
['a', 'b', 'b']
>>> [random.choice('abcde') for _ in range(3)]
['e', 'b', 'e']
>>> [random.choice('abcde') for _ in range(3)]
['d', 'a', 'c']

Alors que nous venons de se joindre à eux avec une chaîne vide si la séquence devient une chaîne de caractères:

>>> ''.join(['a', 'b', 'b'])
'abb'
>>> [random.choice('abcde') for _ in range(3)]
['d', 'c', 'b']
>>> ''.join(random.choice('abcde') for _ in range(3))
'dac'

628voto

user247034 Points 81

Ce Débordement de Pile quesion est l'actuel haut de résultats sur Google pour "chaîne aléatoire Python". L'actuel haut réponse est:

''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))

C'est une excellente méthode, mais le GÉNÉRATEUR aléatoire est pas cryptographique sécurisé. Je suppose que beaucoup de gens à la recherche de cette question vous voulez générer des chaînes aléatoires pour le chiffrement ou le mot de passe. Vous pouvez le faire en toute sécurité par un petit changement dans le code ci-dessus:

''.join(random.SystemRandom().choice(string.uppercase + string.digits) for _ in xrange(n))

À l'aide de random.SystemRandom() au lieu de simplement aléatoire utilise /dev/urandom sur *nix de machines et d' CryptGenRandom() dans Windows. Ce sont cryptographique sécurisé PRNGs. À l'aide de random.choice au lieu de random.SystemRandom().choice dans une application qui requiert une sécurité PRNG pourrait être potentiellement dévastatrice, et compte tenu de la popularité de cette question, je parie que l'erreur a été faite de nombreuses fois déjà.

254voto

tschundeee Points 9241

Simplement utiliser Python builtin uuid:

Si Uuid sont d'accord pour vos besoins, utiliser les uuid paquet.

Une Solution En Ligne:

import uuid; str(uuid.uuid4().get_hex().upper()[0:6])

Dans La Profondeur De La Version:

Exemple:

import uuid
uuid.uuid4() #uuid4 => full random uuid
# Outputs something like: UUID('0172fc9a-1dac-4414-b88d-6b9a6feb91ea')

Si vous avez besoin exactement votre format (par exemple, "6U1S75"), vous pouvez le faire comme ceci:

import uuid

def my_random_string(string_length=10):
    """Returns a random string of length string_length."""
    random = str(uuid.uuid4()) # Convert UUID format to a Python string.
    random = random.upper() # Make all characters uppercase.
    random = random.replace("-","") # Remove the UUID '-'.
    return random[0:string_length] # Return the random string.

print(my_random_string(6)) # For example, D9E50C

56voto

Anurag Uniyal Points 31931

Plus simple, plus rapide mais un peu moins aléatoire façon est d'utiliser des random.sample au lieu de choisir chaque lettre séparément, Si le n répétitions sont autorisés, agrandir votre base aléatoire par n fois par exemple

import random
import string

char_set = string.ascii_uppercase + string.digits
print ''.join(random.sample(char_set*6, 6))

Note: ( à partir de la pcurry du commentaire) aléatoire.l'échantillon empêche caractère de la réutilisation, en multipliant la taille du jeu de caractères fait de multiples répétitions possibles, mais ils sont encore moins susceptibles alors qu'ils sont dans un pur effet du hasard. Si nous optons pour une chaîne de longueur 6, et nous choisissons " X "comme premier caractère, le choix, par exemple, les chances d'obtenir" X "pour le second caractère sont les mêmes que les chances d'obtenir des" X " comme premier caractère. Dans l'aléatoire.exemple de mise en œuvre, les chances d'obtenir " X " tout caractère suivant ne sont 6/7 les chances de l'obtenir en tant que premier caractère

20voto

quamrana Points 6411

La prise de la réponse à partir d'Ignacio, cela fonctionne avec la version 2.6 de Python:

import random
import string

N=6
print ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))

Exemple de sortie:

JQUBT2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X