Strings aleatórios em Python


96

Como você cria uma string aleatória em Python?

Eu precisava que fosse um número e depois a repetição de caracteres até que você fizesse isso é o que eu criei

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

Seja mais específico, dê alguns exemplos do que você está procurando.
sberry

Respostas:


223

Gerando strings de (por exemplo) caracteres minúsculos:

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'

3
Melhor resposta até agora. Eu usaria randomword(length, source_alpha=string.lowercase)e xrange(length), no entanto.
Hank Gay

1
Observe que, embora esta seja uma resposta muito boa, o OP modificou a pergunta para invalidá-la. E para dar sua própria resposta.
Blair Conrad

29
Para compatibilidade com Python 3, usestring.ascii_lowercase
dogwynn

@BlairConrad: Eu diria que a pergunta é muito ampla, por exemplo, os.urandom(length)responde a pergunta original e @sth leu a mente de OP incorretamente.
jfs

1
Do Python 3.6, random.choicesseria mais rápido.
IanS

58

Uma vez que esta pergunta é razoavelmente, uh, aleatória, isso pode funcionar para você:

>>> import uuid
>>> print uuid.uuid4()
58fe9784-f60a-42bc-aa94-eb8f1a7e5c17

6
Em muitos casos, o aleatório não é realmente necessário. Em vez disso, tudo o que você realmente precisa é único.
Chase Seibert

1
você pode usar str(uuid.uuid4())se quiser usá-lo como uma string.
Swagatika

2
str(uuid.uuid4()).split("-")[0]Resultado:'4bcb6450'
Vlad Gulin

Bom ponto, Vlad. Para algo mais longo, '' .join (str (uuid.uuid4 ()). Split ('-')) também funciona. Resultado: '00db8a458c71415c9a263ff08667dd93'
Brandon

35
>>> import random
>>> import string
>>> s=string.lowercase+string.digits
>>> ''.join(random.sample(s,10))
'jw72qidagk

Arrumado! Na verdade, estou usando isso para um gerador de senha aleatória agora! Obrigado!
Chandsie

13
random.sample terá uma amostra de caracteres exclusivos de s, ou seja, os caracteres da senha nunca serão repetidos. Isso é consideravelmente menos seguro do que usar random.choice como na resposta aceita.
Nick Zalutskiy de

3
@NickZalutskiy: random.choicetambém não é seguro. Use random.SystemRandom().choice()ou use os.urandom()diretamente .
jfs

1
AVISO! tome nota dos dois comentários acima. random.sample retorna amostras exclusivas. os caracteres não se repetem. portanto, a string retornada é menos aleatória. Para erros de strings maiores: 'ValueError: amostra maior que população'.
gaoithe

1
No Python 3, lowercasedeve ser substituído porascii_lowercase
Attaque

18

Resposta à pergunta original:

os.urandom(n)

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

Retorne uma string de n bytes aleatórios adequados para uso criptográfico.

Esta função retorna bytes aleatórios de uma fonte de aleatoriedade específica do sistema operacional. Os dados retornados devem ser imprevisíveis o suficiente para aplicativos criptográficos, embora sua qualidade exata dependa da implementação do sistema operacional. Em um sistema semelhante ao UNIX, isso consultará / dev / urandom e, no Windows, usará CryptGenRandom. Se uma fonte de aleatoriedade não for encontrada, NotImplementedError será gerado.

Para obter uma interface fácil de usar para o gerador de números aleatórios fornecido por sua plataforma, consulte random.SystemRandom.


5

Você pode construir caracteres ascii aleatórios como:

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

E então construa uma string mais longa como:

len = 50
print ''.join( [chr(random.randint(0,255)) for i in xrange(0,len)] )

1
Por que usar formatação de string? ''.join(map(chr, random.randint(0,256) for _ in xrange(len)))
Chris Lutz

5

Você realmente não disse muito sobre que tipo de string aleatório você precisa. Mas em qualquer caso, você deve olhar para o randommódulo.

Uma solução muito simples é colada abaixo.

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)

fyi, você pode omitir o conjunto externo de parênteses em sua instrução de retorno.
recursivo de

4

Às vezes, eu queria cadeias de caracteres aleatórias que são semi-pronunciáveis, semi-memoráveis.

import random

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

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

Então,

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

Para evitar palavras de 4 letras, não defina lengthcomo 4.

Jim


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

comprimento deve ser <= len (string.letters) = 53. exemplo 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']
>>> 

Aproveitar. ;)



0

Esta função gera string aleatória consistindo em letras maiúsculas e minúsculas, dígitos, passe o separador de comprimento, no_of_blocks para especificar o formato da string

por exemplo: len_sep = 4, no_of_blocks = 4 irá gerar o seguinte padrão,

F4nQ-Vh5z-JKEC-WhuS

Onde, o separador de comprimento adicionará "-" após 4 caracteres

XXXX-

nenhum dos blocos irá gerar o seguinte padrão de caracteres como string

XXXX - XXXX - XXXX - XXXX

se uma única string aleatória for necessária, apenas mantenha a variável no_of_blocks igual a 1 e len_sep para especificar o comprimento da string aleatória.

por exemplo: len_sep = 10, no_of_blocks = 1, irá gerar o seguinte padrão, isto é. sequência aleatória de comprimento 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

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)

saída: FfxjmkyyLG5HvLeRudDS


0

Em python3.6+você pode usar o secretsmódulo :

O módulo de segredos é usado para gerar números aleatórios criptograficamente fortes, adequados para o gerenciamento de dados, como senhas, autenticação de conta, tokens de segurança e segredos relacionados.

Em particular, os segredos devem ser usados ​​em preferência ao gerador de números pseudo-aleatórios padrão no módulo aleatório, que é projetado para modelagem e simulação, não para segurança ou criptografia.

Ao testar a geração de 768bittokens de segurança, descobri:

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

Os secretsmódulos são mais lentos, mas fora do teste é o que você deve usar para fins 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))

-1

tente importar o pacote abaixo de importação aleatória *


Isso não resolve a questão de forma alguma. Existe uma maneira melhor (pythônica) de gerar este padrão aleatório
drekbour
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.