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
RHicke
fonte
Seja mais específico, dê alguns exemplos do que você está procurando.
sberry
possível duplicata de strings aleatórias no Python 2.6 (isso está OK?)
Caracol mecânico

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'
sth
fonte
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
Brandon
fonte
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
ghostdog74
fonte
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.

Tom
fonte
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)] )
Ross Rogers
fonte
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)
MAK
fonte
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

Jim
fonte
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. ;)

Spouk
fonte
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
Manoj Selvin
fonte
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

Rakesh babu
fonte
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))
Stuart Cardall
fonte
-1

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

Yash chitroda
fonte
Isso não resolve a questão de forma alguma. Existe uma maneira melhor (pythônica) de gerar este padrão aleatório
drekbour