Python'da rastgele dizeler


96

Python'da rastgele bir dizeyi nasıl yaratırsınız?

Numara olmasına ihtiyacım vardı ve sonra karakter tekrarlanana kadar bunu yarattım

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

Daha spesifik olun, aradığınız şeyle ilgili bazı örnekler verin.
sberry

Yanıtlar:


224

Küçük harfli karakterlerden (örneğin) dize oluşturma:

import random, string

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

Sonuçlar:

>>> randomword(10)
'vxnxikmhdc'
>>> randomword(10)
'ytqhdohksy'

3
Şimdiye kadarki en iyi cevap. Bana kalırsa doğru randomword(length, source_alpha=string.lowercase)ve xrange(length)olsa.
Hank Gay

1
Bu çok iyi bir cevap olmasına rağmen, OP'nin soruyu geçersiz kılacak şekilde değiştirdiğini unutmayın. Ve kendi cevabını vermek için.
Blair Conrad

29
Python 3 uyumluluğu için şunu kullanınstring.ascii_lowercase
dogwynn

@BlairConrad: Ben soru çok geniş örn olduğunu söyleyebilirim, os.urandom(length)cevapları özgün soru ve @sth yanlış OP'ın zihin okumuştu.
jfs

2
Python 3.6'dan random.choicesdaha hızlı olurdu.
IanS

60

Bu soru oldukça rastgele olduğundan, bu sizin için işe yarayabilir:

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

6
Çoğu durumda, rastgele gerçekten gerekli değildir. Aksine, gerçekten ihtiyacınız olan tek şey benzersizdir.
Chase Seibert

1
Eğer kullanabilirsiniz str(uuid.uuid4())bir dize olarak kullanmak istiyorum.
Swagatika

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

İyi nokta Vlad. Daha uzun bir şey için, '' .join (str (uuid.uuid4 ()). Split ('-')) de işe yarar. Çıktı: '00db8a458c71415c9a263ff08667dd93'
Brandon

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

Düzgün! Aslında bunu şimdi rastgele bir şifre oluşturucu için kullanıyorum! Teşekkürler!
chandsie

13
random.sample, s'den benzersiz karakterleri örnekleyecektir, yani şifredeki karakterler asla tekrarlanmayacaktır. Bu, kabul edilen cevapta olduğu gibi random.choice kullanmaktan çok daha az güvenlidir.
Nick Zalutskiy

3
@NickZalutskiy: random.choicegüvenli de değil. Doğrudan kullanın random.SystemRandom().choice()veya kullanınos.urandom() .
jfs

1
UYARI! yukarıdaki iki yorumu not alın. random.sample benzersiz örnekler döndürür. karakterler tekrarlanmaz. dolayısıyla döndürülen dizge daha az rastgeledir. Daha büyük dizeler hatası için: 'ValueError: popülasyondan büyük örnek'.
gaoithe

1
Python 3'te lowercaseşu ile değiştirilmelidirascii_lowercase
Attaque

18

Orijinal sorunun cevabı:

os.urandom(n)

Alıntı: http://docs.python.org/2/library/os.html

Kriptografik kullanım için uygun n rastgele bayt dizisi döndürür.

Bu işlev, işletim sistemine özgü bir rastgelelik kaynağından rastgele baytlar döndürür. Döndürülen veriler, kriptografik uygulamalar için yeterince öngörülemez olmalıdır, ancak kesin kalitesi işletim sistemi uygulamasına bağlıdır. UNIX benzeri bir sistemde bu / dev / urandom'u sorgulayacak ve Windows'ta CryptGenRandom kullanacaktır. Bir rastgelelik kaynağı bulunmazsa, NotImplementedError ortaya çıkar.

Platformunuz tarafından sağlanan rastgele sayı üretecine yönelik kullanımı kolay bir arayüz için lütfen random.SystemRandom'a bakın.


5

Şunlar gibi rastgele ascii karakterleri oluşturabilirsiniz:

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

Ve sonra şöyle daha uzun bir dizge oluşturun:

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

1
Neden dize biçimlendirmesi kullanılıyor? ''.join(map(chr, random.randint(0,256) for _ in xrange(len)))
Chris Lutz

5

Ne tür bir rastgele diziye ihtiyacınız olduğu hakkında pek bir şey söylemediniz. Ancak her durumda, randommodüle bakmalısınız .

Aşağıda çok basit bir çözüm yapıştırılmıştır.

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, return ifadenizdeki en dıştaki parantez kümesini atlayabilirsiniz.
yinelemeli

4

Bazen, yarı telaffuz edilebilir, yarı akılda kalıcı rastgele dizeler istedim.

import random

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

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

Sonra,

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

4 harfli sözcüklerden kaçınmak için 4'e ayarlamayın length.

Jim


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

uzunluk <= len (string.letters) = 53 olmalıdır. sonuç örneği

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

Zevk almak. ;)



1

İçinde modülüpython3.6+ kullanabilirsiniz :secrets

Gizli anahtarlar modülü, parolalar, hesap kimlik doğrulama, güvenlik belirteçleri ve ilgili sırlar gibi verileri yönetmek için uygun, kriptografik olarak güçlü rastgele sayılar üretmek için kullanılır.

Özellikle, güvenlik veya kriptografi için değil modelleme ve simülasyon için tasarlanmış rasgele modüldeki varsayılan sözde rasgele sayı üretecine tercih edilerek sırlar kullanılmalıdır.

768bitGüvenlik belirteçlerinin üretimini test ederken buldum:

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

secretsModülleri yavaştır ama onu test dışında size kriptografik amaçlarla kullanıyor gereken budur:

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))

0

Bu işlev, büyük, küçük harfler, rakamlardan oluşan rastgele dizge üretir, uzunluk ayırıcısını iletir, dize biçiminizi belirtmek için no_of_blocks

örneğin: len_sep = 4, no_of_blocks = 4 aşağıdaki kalıbı oluşturur

F4nQ-Vh5z-JKEC-WhuS

Uzunluk ayırıcı 4 karakterden sonra "-" ekler

XXXX-

hiçbir blok dizge olarak aşağıdaki karakter dizisini oluşturmaz

XXXX - XXXX - XXXX - XXXX

eğer tek bir rastgele dizge gerekiyorsa, sadece no_of_blocks değişkenini 1'e ve len_sep'i rasgele dizenin uzunluğunu belirtmek için tutun.

örneğin: len_sep = 10, no_of_blocks = 1, aşağıdaki kalıbı oluşturur, yani. rastgele uzunluk 10 dizisi ,

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)

çıktı: FfxjmkyyLG5HvLeRudDS


-1

aşağıdaki paketi rastgele içe aktarmadan almayı deneyin *


Bu soruya hiç hitap etmiyor. Bu kalıbı rastgele oluşturmanın daha iyi (pitonik) bir yolu var mı
drekbour
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.