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.