Chaînes aléatoires en Python

96

Comment créer une chaîne aléatoire en Python?

J'avais besoin que ce soit un nombre puis un caractère répété jusqu'à ce que vous ayez terminé

def random_id(length):
    number = '0123456789'
    alpha = 'abcdefghijklmnopqrstuvwxyz'
    id = ''
    for i in range(0,length,2):
        id += random.choice(number)
        id += random.choice(alpha)
    return id
RHicke
la source
Soyez plus précis, donnez quelques exemples de ce que vous recherchez.
sberry
duplication possible de chaînes aléatoires en Python 2.6 (Est-ce correct?)
Escargot mécanique

Réponses:

223

Génération de chaînes à partir (par exemple) de caractères minuscules:

import random, string

def randomword(length):
   letters = string.ascii_lowercase
   return ''.join(random.choice(letters) for i in range(length))

Résultats:

>>> randomword(10)
'vxnxikmhdc'
>>> randomword(10)
'ytqhdohksy'
qc
la source
3
Meilleure réponse à ce jour. J'utiliserais randomword(length, source_alpha=string.lowercase)et xrange(length), cependant.
Hank Gay
1
Notez que bien que ce soit une très bonne réponse, l'OP a modifié la question pour l'invalider. Et de fournir sa propre réponse.
Blair Conrad
29
Pour la compatibilité Python 3, utilisezstring.ascii_lowercase
dogwynn
@BlairConrad: Je dirais que la question était trop large, par exemple, os.urandom(length)répond à la question d'origine et @sth avait mal lu l'esprit d'OP.
jfs
2
À partir de Python 3.6, ce random.choicesserait plus rapide.
IanS
58

Puisque cette question est assez, euh, aléatoire, cela peut fonctionner pour vous:

>>> import uuid
>>> print uuid.uuid4()
58fe9784-f60a-42bc-aa94-eb8f1a7e5c17
Brandon
la source
6
Dans de nombreux cas, le hasard n'est pas vraiment nécessaire. Au contraire, tout ce dont vous avez vraiment besoin est unique.
Chase Seibert
1
vous pouvez l'utiliser str(uuid.uuid4())si vous souhaitez l'utiliser comme chaîne.
Swagatika
2
str(uuid.uuid4()).split("-")[0]Sortie:'4bcb6450'
Vlad Gulin
Bon point, Vlad. Pour quelque chose de plus long, '' .join (str (uuid.uuid4 ()). Split ('-')) fonctionne également. Sortie: '00db8a458c71415c9a263ff08667dd93'
Brandon
35
>>> import random
>>> import string
>>> s=string.lowercase+string.digits
>>> ''.join(random.sample(s,10))
'jw72qidagk
ghostdog74
la source
Soigné! J'utilise actuellement ceci pour un générateur de mot de passe aléatoire! Merci!
chandsie
13
random.sample échantillonnera les caractères uniques de s, c'est-à-dire que les caractères du mot de passe ne se répéteront jamais. Ceci est considérablement moins sûr que l'utilisation de random.choice comme dans la réponse acceptée.
Nick Zalutskiy
3
@NickZalutskiy: random.choicen'est pas sécurisé non plus. Utilisez random.SystemRandom().choice()ou utilisez os.urandom()directement .
jfs
1
AVERTISSEMENT! prenez note de deux commentaires ci-dessus. random.sample renvoie des échantillons uniques. les caractères ne sont pas répétés. la chaîne retournée est donc moins aléatoire. Pour les chaînes plus grandes, erreur: «ValueError: sample plus grand que population».
gaoithe
1
Dans Python 3, lowercasedevrait être remplacé parascii_lowercase
Attaque
18

Réponse à la question initiale:

os.urandom(n)

Citation de: http://docs.python.org/2/library/os.html

Renvoie une chaîne de n octets aléatoires adaptée à une utilisation cryptographique.

Cette fonction renvoie des octets aléatoires à partir d'une source aléatoire spécifique au système d'exploitation. Les données renvoyées doivent être suffisamment imprévisibles pour les applications cryptographiques, bien que leur qualité exacte dépende de l'implémentation du système d'exploitation. Sur un système de type UNIX, cela interrogera / dev / urandom, et sous Windows, il utilisera CryptGenRandom. Si une source aléatoire n'est pas trouvée, NotImplementedError sera déclenché.

Pour une interface facile à utiliser avec le générateur de nombres aléatoires fourni par votre plate-forme, veuillez consulter random.SystemRandom.

À M
la source
5

Vous pouvez créer des personnages ascii aléatoires comme:

import random
print chr(random.randint(0,255))

Et puis construisez une chaîne plus longue comme:

len = 50
print ''.join( [chr(random.randint(0,255)) for i in xrange(0,len)] )
Ross Rogers
la source
1
Pourquoi utiliser le formatage de chaîne? ''.join(map(chr, random.randint(0,256) for _ in xrange(len)))
Chris Lutz
5

Vous n'avez pas vraiment dit grand-chose sur le type de chaîne aléatoire dont vous avez besoin. Mais dans tous les cas, vous devriez regarder dans le randommodule.

Une solution très simple est collée ci-dessous.

import random

def randstring(length=10):
    valid_letters='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    return ''.join((random.choice(valid_letters) for i in xrange(length)))

print randstring()
print randstring(20)
MAK
la source
Pour info, vous pouvez omettre le jeu de parenthèses le plus extérieur dans votre déclaration de retour.
récursif le
4

Parfois, j'ai voulu des chaînes aléatoires semi-prononcables, semi-mémorables.

import random

def randomWord(length=5):
    consonants="bcdfghjklmnpqrstvwxyz"
    vowels="aeiou"

    return "".join(random.choice((consonants,vowels)[i%2]) for i in range(length))

Ensuite,

>>> randomWord()
nibit
>>> randomWord()
piber
>>> randomWord(10)
rubirikiro

Pour éviter les mots de 4 lettres, ne définissez pas lengthsur 4.

Jim

Jim
la source
3
random_name = lambda length: ''.join(random.sample(string.letters, length))

la longueur doit être <= len (string.letters) = 53. exemple de résultat

   >>> [random_name(x) for x in range(1,20)]
['V', 'Rq', 'YtL', 'AmUF', 'loFdS', 'eNpRFy', 'iWFGtDz', 'ZTNgCvLA', 'fjUDXJvMP', 'EBrPcYKUvZ', 'GmxPKCnbfih', 'nSiNmCRktdWZ', 'VWKSsGwlBeXUr', 'i
stIFGTUlZqnav', 'bqfwgBhyTJMUEzF', 'VLXlPiQnhptZyoHq', 'BXWATvwLCUcVesFfk', 'jLngHmTBtoOSsQlezV', 'JOUhklIwDBMFzrTCPub']
>>> 

Prendre plaisir. ;)

Spouk
la source
1

Dans python3.6+vous pouvez utiliser le secretsmodule :

Le module secrets est utilisé pour générer des nombres aléatoires cryptographiquement forts adaptés à la gestion de données telles que les mots de passe, l'authentification de compte, les jetons de sécurité et les secrets associés.

En particulier, les secrets doivent être utilisés de préférence au générateur de nombres pseudo-aléatoires par défaut dans le module aléatoire, qui est conçu pour la modélisation et la simulation, et non pour la sécurité ou la cryptographie.

En testant la génération de 768bitjetons de sécurité, j'ai trouvé:

  • random.choices()- 0.000246secondes
  • secrets.choice()- 0.003529secondes

Les secretsmodules sont plus lents, mais en dehors des tests, c'est ce que vous devriez utiliser à des fins cryptographiques:

import string, secrets

def random_string(size):        
        letters = string.ascii_lowercase+string.ascii_uppercase+string.digits            
        return ''.join(secrets.choice(letters) for i in range(size))

print(random_string(768))
Stuart Cardall
la source
0

Cette fonction génère une chaîne aléatoire composée de lettres majuscules, minuscules, de chiffres, passez le séparateur de longueur, no_of_blocks pour spécifier votre format de chaîne

par exemple: len_sep = 4, no_of_blocks = 4 générera le motif suivant,

F4nQ-Vh5z-JKEC-WhuS

Où, le séparateur de longueur ajoutera "-" après 4 caractères

XXXX-

no of blocks générera le motif suivant de caractères sous forme de chaîne

XXXX - XXXX - XXXX - XXXX

si une seule chaîne aléatoire est nécessaire, gardez simplement la variable no_of_blocks égale à 1 et len_sep pour spécifier la longueur de la chaîne aléatoire.

par exemple: len_sep = 10, no_of_blocks = 1, générera le modèle suivant ie. chaîne aléatoire de longueur 10 ,

F01xgCdoDU

import random as r

def generate_random_string(len_sep, no_of_blocks):
    random_string = ''
    random_str_seq = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    for i in range(0,len_sep*no_of_blocks):
        if i % len_sep == 0 and i != 0:
            random_string += '-'
        random_string += str(random_str_seq[r.randint(0, len(random_str_seq) - 1)])
    return random_string
Manoj Selvin
la source
0
import random 
import string

def get_random_string(size):
    chars = string.ascii_lowercase+string.ascii_uppercase+string.digits
    ''.join(random.choice(chars) for _ in range(size))

print(get_random_string(20)

sortie: FfxjmkyyLG5HvLeRudDS

Rakesh babu
la source
-1

essayez d'importer le package ci-dessous à partir d'une importation aléatoire *

Yash chitroda
la source
Cela ne répond pas du tout à la question. Existe-t-il un meilleur moyen (pythonique) de générer ce motif au hasard
drekbour