Chuỗi ngẫu nhiên trong Python


96

Làm cách nào để bạn tạo một chuỗi ngẫu nhiên trong Python?

Tôi cần nó là số sau đó lặp lại ký tự cho đến khi bạn hoàn thành, đây là những gì tôi đã tạo

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

Cụ thể hơn, đưa ra một số ví dụ về những gì bạn đang tìm kiếm.
sberry

Câu trả lời:


223

Tạo chuỗi từ (ví dụ) ký tự chữ thường:

import random, string

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

Các kết quả:

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

3
Câu trả lời tốt nhất cho đến nay. Tôi muốn sử dụng randomword(length, source_alpha=string.lowercase)xrange(length), mặc dù.
Hank Gay

1
Lưu ý rằng mặc dù đây là một câu trả lời rất hay, OP đã sửa đổi câu hỏi để làm mất hiệu lực của nó. Và để cung cấp câu trả lời của riêng mình.
Blair Conrad

29
Để tương thích với Python 3, hãy sử dụngstring.ascii_lowercase
dogwynn

@BlairConrad: Tôi muốn nói rằng câu hỏi quá rộng, ví dụ: os.urandom(length)trả lời câu hỏi ban đầu và @sth đã đọc suy nghĩ của OP không chính xác.
jfs

1
Từ Python 3.6, random.choicessẽ nhanh hơn.
IanS

58

Vì câu hỏi này khá, uh, ngẫu nhiên, điều này có thể phù hợp với bạn:

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

6
Trong nhiều trường hợp, ngẫu nhiên không thực sự bắt buộc. Đúng hơn, tất cả những gì bạn thực sự cần là duy nhất.
Chase Seibert

1
bạn có thể sử dụng str(uuid.uuid4())nếu bạn muốn sử dụng nó như một chuỗi.
Swagatika

2
str(uuid.uuid4()).split("-")[0]Đầu ra:'4bcb6450'
Vlad Gulin

Tốt, Vlad. Đối với một cái gì đó lâu hơn, '' .join (str (uuid.uuid4 ()). Split ('-')) cũng hoạt động. Đầu ra: '00db8a458c71415c9a263ff08667dd93'
Brandon

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

Khéo léo! Tôi thực sự đang sử dụng nó cho một trình tạo mật khẩu ngẫu nhiên ngay bây giờ! Cảm ơn!
chandsie

13
random.sample sẽ lấy mẫu các ký tự duy nhất từ ​​s, tức là các ký tự trong mật khẩu sẽ không bao giờ lặp lại. Điều này kém an toàn hơn đáng kể so với sử dụng random.choice như trong câu trả lời được chấp nhận.
Nick Zalutskiy

3
@NickZalutskiy: random.choicecũng không an toàn. Sử dụng random.SystemRandom().choice()hoặc sử dụng os.urandom()trực tiếp .
jfs

1
CẢNH BÁO! lưu ý hai ý kiến ​​trên. random.sample trả về các mẫu duy nhất. các ký tự không được lặp lại. vì vậy chuỗi trả về ít ngẫu nhiên hơn. Đối với lỗi chuỗi lớn hơn: 'ValueError: sample lớn hơn dân số'.
gaoithe

1
Trong Python 3, lowercasenên được thay thế bằngascii_lowercase
Attaque

18

Câu trả lời cho câu hỏi ban đầu:

os.urandom(n)

Trích dẫn từ: http://docs.python.org/2/library/os.html

Trả về một chuỗi n byte ngẫu nhiên thích hợp cho việc sử dụng mật mã.

Hàm này trả về các byte ngẫu nhiên từ nguồn ngẫu nhiên dành riêng cho hệ điều hành. Dữ liệu trả về phải đủ khó đoán cho các ứng dụng mật mã, mặc dù chất lượng chính xác của nó phụ thuộc vào việc triển khai hệ điều hành. Trên hệ thống giống UNIX, nó sẽ truy vấn / dev / urandom và trên Windows, nó sẽ sử dụng CryptGenRandom. Nếu không tìm thấy nguồn ngẫu nhiên, NotImplementedError sẽ xuất hiện.

Để có giao diện dễ sử dụng cho trình tạo số ngẫu nhiên do nền tảng của bạn cung cấp, vui lòng xem random.SystemRandom.


5

Bạn có thể xây dựng các ký tự ascii ngẫu nhiên như:

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

Và sau đó xây dựng một chuỗi dài hơn như:

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

1
Tại sao sử dụng định dạng chuỗi? ''.join(map(chr, random.randint(0,256) for _ in xrange(len)))
Chris Lutz

5

Bạn chưa thực sự nói nhiều về loại chuỗi ngẫu nhiên bạn cần. Nhưng trong mọi trường hợp, bạn nên xem xét randommô-đun.

Một giải pháp rất đơn giản được dán bên dưới.

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 bạn có thể bỏ qua tập hợp parens ngoài cùng trong câu lệnh trả về của mình.
đệ quy

4

Đôi khi, tôi muốn các chuỗi ngẫu nhiên có thể bán phát âm, bán ghi nhớ.

import random

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

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

Sau đó,

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

Để tránh các từ gồm 4 chữ cái, đừng đặt lengththành 4.

Jim


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

chiều dài phải <= len (string.letters) = 53. ví dụ kết quả

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

Thưởng thức. ;)



0

Hàm này tạo chuỗi ngẫu nhiên bao gồm chữ hoa, chữ thường, chữ số, chuyển bộ phân tách độ dài, no_of_blocks để chỉ định định dạng chuỗi của bạn

ví dụ: len_sep = 4, no_of_blocks = 4 sẽ tạo ra mẫu sau,

F4nQ-Vh5z-JKEC-WhuS

Trong đó, trình phân tách độ dài sẽ thêm "-" sau 4 ký tự

XXXX-

không có khối nào sẽ tạo ra các ký tự sau dưới dạng chuỗi

XXXX - XXXX - XXXX - XXXX

nếu cần một chuỗi ngẫu nhiên duy nhất, chỉ cần giữ biến no_of_blocks bằng 1 và len_sep để chỉ định độ dài của chuỗi ngẫu nhiên.

ví dụ: len_sep = 10, no_of_blocks = 1, sẽ tạo ra mẫu sau tức là. chuỗi ngẫu nhiên có độ dài 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)

đầu ra: FfxjmkyyLG5HvLeRudDS


0

Trong python3.6+bạn có thể sử dụng secretsmô-đun :

Mô-đun bí mật được sử dụng để tạo các số ngẫu nhiên mạnh về mặt mật mã phù hợp để quản lý dữ liệu như mật khẩu, xác thực tài khoản, mã thông báo bảo mật và các bí mật liên quan.

Đặc biệt, các bí mật nên được sử dụng ưu tiên cho trình tạo số giả ngẫu nhiên mặc định trong mô-đun ngẫu nhiên, được thiết kế để mô hình hóa và mô phỏng, không phải bảo mật hoặc mật mã.

Trong quá trình thử nghiệm tạo 768bitmã thông báo bảo mật, tôi đã tìm thấy:

  • random.choices()- 0.000246giây
  • secrets.choice()- 0.003529giây

Các secretsmô-đun chậm hơn nhưng ngoài thử nghiệm, đó là những gì bạn nên sử dụng cho các mục đích mật mã:

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

thử nhập gói bên dưới từ nhập ngẫu nhiên *


Điều này không giải quyết câu hỏi nào cả. Có cách nào tốt hơn (pythonic) để tạo ngẫu nhiên mẫu này không
drekbour
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.