Cadenas aleatorias en Python

96

¿Cómo se crea una cadena aleatoria en Python?

Necesitaba que fuera un número y luego repetir el carácter hasta que termines, esto es lo que creé

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
fuente
Sea más específico, dé algunos ejemplos de lo que está buscando.
sberry
posible duplicado de cadenas aleatorias en Python 2.6 (¿está bien?)
Caracol mecánico

Respuestas:

224

Generando cadenas de (por ejemplo) caracteres en minúscula:

import random, string

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

Resultados:

>>> randomword(10)
'vxnxikmhdc'
>>> randomword(10)
'ytqhdohksy'
algo
fuente
3
La mejor respuesta hasta ahora. Yo usaría randomword(length, source_alpha=string.lowercase)y xrange(length), sin embargo.
Hank Gay
1
Tenga en cuenta que aunque esta es una muy buena respuesta, el OP ha modificado la pregunta para invalidarla. Y para dar su propia respuesta.
Blair Conrad
29
Para compatibilidad con Python 3, usestring.ascii_lowercase
dogwynn
@BlairConrad: Yo diría que la pregunta era demasiado amplia, por ejemplo, os.urandom(length)responde la pregunta original y @sth había leído la mente de OP incorrectamente.
jfs
2
Desde Python 3.6, random.choicessería más rápido.
IanS
58

Dado que esta pregunta es bastante, eh, aleatoria, esto puede funcionar para usted:

>>> import uuid
>>> print uuid.uuid4()
58fe9784-f60a-42bc-aa94-eb8f1a7e5c17
Brandon
fuente
6
En muchos casos, el azar no es realmente necesario. Más bien, todo lo que realmente necesita es único.
Chase Seibert
1
podría usar str(uuid.uuid4())si desea usarlo como una cadena.
Swagatika
2
str(uuid.uuid4()).split("-")[0]Salida:'4bcb6450'
Vlad Gulin
Buen punto, Vlad. Por algo más largo, '' .join (str (uuid.uuid4 ()). Split ('-')) también funciona. Salida: '00db8a458c71415c9a263ff08667dd93'
Brandon
35
>>> import random
>>> import string
>>> s=string.lowercase+string.digits
>>> ''.join(random.sample(s,10))
'jw72qidagk
ghostdog74
fuente
¡Ordenado! De hecho, estoy usando esto para un generador de contraseñas al azar ahora. ¡Gracias!
chandsie
13
random.sample muestreará caracteres únicos de s, es decir, los caracteres de la contraseña nunca se repetirán. Esto es considerablemente menos seguro que usar random.choice como en la respuesta aceptada.
Nick Zalutskiy
3
@NickZalutskiy: random.choicetampoco es seguro. Usar random.SystemRandom().choice()o usar os.urandom()directamente .
jfs
1
¡ADVERTENCIA! tome nota de los dos comentarios anteriores. random.sample devuelve muestras únicas. los caracteres no se repiten. por lo que la cadena devuelta es menos aleatoria. Para errores de cadenas más grandes: 'ValueError: muestra mayor que la población'.
gaoithe
1
En Python 3, lowercasedebe reemplazarse porascii_lowercase
Attaque
18

Respuesta a la pregunta original:

os.urandom(n)

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

Devuelve una cadena de n bytes aleatorios adecuados para uso criptográfico.

Esta función devuelve bytes aleatorios de una fuente de aleatoriedad específica del sistema operativo. Los datos devueltos deben ser lo suficientemente impredecibles para las aplicaciones criptográficas, aunque su calidad exacta depende de la implementación del sistema operativo. En un sistema similar a UNIX, esto consultará / dev / urandom, y en Windows usará CryptGenRandom. Si no se encuentra una fuente de aleatoriedad, se generará NotImplementedError.

Para obtener una interfaz fácil de usar para el generador de números aleatorios proporcionado por su plataforma, consulte random.SystemRandom.

Tom
fuente
5

Puede construir caracteres ascii aleatorios como:

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

Y luego construya una cadena más larga como:

len = 50
print ''.join( [chr(random.randint(0,255)) for i in xrange(0,len)] )
Ross Rogers
fuente
1
¿Por qué utilizar el formato de cadena? ''.join(map(chr, random.randint(0,256) for _ in xrange(len)))
Chris Lutz
5

Realmente no ha dicho mucho sobre qué tipo de cadena aleatoria necesita. Pero en cualquier caso, debería mirar en el randommódulo.

A continuación se pega una solución muy simple.

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
fuente
Para su información, puede omitir el conjunto más externo de parens en su declaración de devolución.
recursivo
4

A veces, he querido cadenas aleatorias que sean semi-pronunciables, semi-memorables.

import random

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

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

Luego,

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

Para evitar palabras de 4 letras, no establezca length4.

Jim

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

la longitud debe ser <= len (string.letters) = 53. ejemplo de resultado

   >>> [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']
>>> 

Disfrutar. ;)

Spouk
fuente
1

En python3.6+puede utilizar el secretsmódulo :

El módulo de secretos se utiliza para generar números aleatorios criptográficamente fuertes adecuados para administrar datos como contraseñas, autenticación de cuentas, tokens de seguridad y secretos relacionados.

En particular, los secretos deben usarse con preferencia al generador de números pseudoaleatorios predeterminado en el módulo aleatorio, que está diseñado para modelado y simulación, no para seguridad o criptografía.

Al probar la generación de 768bittokens de seguridad, encontré:

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

Los secretsmódulos son más lentos, pero fuera de la prueba, es lo que debería usar con fines criptográficos:

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

Esta función genera una cadena aleatoria que consta de letras mayúsculas y minúsculas, dígitos, pasa el separador de longitud, no_of_blocks para especificar su formato de cadena

por ejemplo: len_sep = 4, no_of_blocks = 4 generará el siguiente patrón,

F4nQ-Vh5z-JKEC-WhuS

Donde, el separador de longitud agregará "-" después de 4 caracteres

XXXX-

ningún bloque generará el siguiente patrón de caracteres como cadena

XXXX - XXXX - XXXX - XXXX

si se necesita una sola cadena aleatoria, simplemente mantenga la variable no_of_blocks igual a 1 y len_sep para especificar la longitud de la cadena aleatoria.

por ejemplo: len_sep = 10, no_of_blocks = 1, generará el siguiente patrón, es decir. cadena aleatoria de longitud 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
fuente
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)

salida: FfxjmkyyLG5HvLeRudDS

Rakesh babu
fuente
-1

intente importar el siguiente paquete desde una importación aleatoria *

Yash chitroda
fuente
Esto no aborda la pregunta en absoluto. ¿Hay una forma mejor (pitónica) de generar este patrón al azar?
drekbour