Tạo một chữ cái ngẫu nhiên trong Python


146

Có cách nào để tạo các chữ cái ngẫu nhiên trong Python (như Random.randint nhưng cho các chữ cái) không? Chức năng phạm vi của Random.randint sẽ tốt nhưng có một trình tạo chỉ xuất ra một chữ cái ngẫu nhiên sẽ tốt hơn không có gì.

Câu trả lời:


247

Đơn giản:

>>> import string
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> import random
>>> random.choice(string.ascii_letters)
'j'

string.ascii_letters trả về một chuỗi chứa chữ thường và chữ in hoa theo ngôn ngữ hiện tại.

random.choice trả về một yếu tố duy nhất, ngẫu nhiên từ một chuỗi.


12
Đó thực sự là string.ascii_lowercase hoặc string.ascii_uppercase.
Taylor Leese

9
Thông thường, tôi cần một chuỗi các randoms, đây là (sau from string import ascii_letters, digitsfrom random import choice):''.join([choice(ascii_letters + digits) for i in range(32)])
Devin

7
@joaquin chuỗi.letters có trong python 2.7.7.
Wilson Canda

70
>>> import random
>>> import string
>>> random.choice(string.ascii_letters)
'g'

Điều này có thể là chữ thường hoặc chữ hoa. Không chắc chắn nếu đó là những gì cần thiết.
Taylor Leese

3
@TaylorLeese, như tôi đã biết rằng có ba tùy chọn bao gồm ascii_letters, ascii_uppercaseascii_lowercase.
trdngy

29
>>>def random_char(y):
       return ''.join(random.choice(string.ascii_letters) for x in range(y))

>>>print (random_char(5))
>>>fxkea

để tạo y số ký tự ngẫu nhiên


7
cũng:''.join(random.sample(string.ascii_lowercase,5))
Dannid

@Dannid Không random.sample()trả về một bộ giá trị duy nhất từ đầu vào, không giống với random.choice()?
Droppy

Có, mặc dù nếu bạn chỉ chọn một chữ cái không tạo ra sự khác biệt Ngoài ra, bạn có thể muốn có 5 chữ cái duy nhất - OP không chỉ định, và cả hai random.choicerandom.randinttrả về một giá trị. Bạn cũng có thể sử dụng numpy.random.choiceđể cung cấp một bộ duy nhất nếu bạn thêm thay thế = Sai, như vậy:numpy.random.choice(string.ascii_lowercase, size=5, replace=False)
Dannid

21
>>> import random
>>> import string    
>>> random.choice(string.ascii_lowercase)
'b'

13

Một cách khác, cho sự hoàn chỉnh:

>>> chr(random.randrange(97, 97 + 26))

Sử dụng thực tế là ascii 'a' là 97 và có 26 chữ cái trong bảng chữ cái.

Khi xác định giới hạn trên và dưới của lệnh random.randrange()gọi hàm, hãy nhớ rằng nó random.randrange()là độc quyền ở giới hạn trên của nó, nghĩa là nó sẽ chỉ tạo ra một số nguyên ít hơn 1 đơn vị so với giá trị được cung cấp.


3
Điều đó phụ thuộc vào bảng chữ cái mà chúng ta đang nói đến ;-)
Joey

không nên nó được chr(random.randrange(97, 97 + 26 - 1))?
zhongxiao37

1
@ zhongxiao37 Thực sự, nó nên như vậy chr(random.randrange(97, 97 + 26). random.randrange()là độc quyền trên giới hạn trên của nó, có nghĩa là để có được toàn bộ phạm vi các ký tự 97 - 122, đối số được truyền phải là 123.
Kieran Moynihan

@KieranMoynihan Cảm ơn bạn đã chia sẻ. Tôi đã kiểm tra lại và bạn đã đúng. Bây giờ tôi thấy tại sao 97 + 26được sử dụng.
zhongxiao37

6

Bạn có thể sử dụng điều này để nhận một hoặc nhiều chữ cái ngẫu nhiên

import random
import string
random.seed(10)
letters = string.ascii_lowercase
rand_letters = random.choices(letters,k=5) # where k is the number of required rand_letters

print(rand_letters)

['o', 'l', 'p', 'f', 'v']

@NigelRen phân phối là random.choicesgì?
Jimmy

@SalmanLashkarara help(random.choices)tuyên bố If the relative weights or cumulative weights are not specified, the selections are made with equal probability.Điều này có nghĩa là, phân phối là phân phối thống nhất rời rạc ( en.wikipedia.org/wiki/Discittle_uniform_distribution ).
Qaswed

5

Bạn chỉ có thể lập một danh sách:

import random
list1=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
b=random.randint(0,7)
print(list1[b])

4
def randchar(a, b):
    return chr(random.randint(ord(a), ord(b)))

3
import random
def guess_letter():
    return random.choice('abcdefghijklmnopqrstuvwxyz')

2
import random
def Random_Alpha():
    l = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
    return l[random.randint(0,25)]

print(Random_Alpha())

1

Bạn có thể dùng

map(lambda a : chr(a),  np.random.randint(low=65, high=90, size=4))

0
import string
import random

KEY_LEN = 20

def base_str():
    return (string.letters+string.digits)   
def key_gen():
    keylist = [random.choice(base_str()) for i in range(KEY_LEN)]
    return ("".join(keylist))

Bạn có thể nhận được các chuỗi ngẫu nhiên như thế này:

g9CtUljUWD9wtk1z07iF
ndPbI1DDn6UvHSQoDMtd
klMFY3pTYNVWsNJ6cs34
Qgr7OEalfhXllcFDGh2l

1. Với Python3, nó sẽ là string.ascii_letters2. Bạn có thể lưu mức độ hiểu danh sách bằng cách sử dụng keylist = random.choices(base_str(), k=KEY_LEN)3. Tại sao phải có base_strchức năng mà không phải là một base_str = string.ascii_letters+string.digits?
Qaswed

0
def create_key(key_len):
    key = ''
    valid_characters_list = string.letters + string.digits
    for i in range(key_len):
        character = choice(valid_characters_list)
        key = key + character
    return key

def create_key_list(key_num):
    keys = []
    for i in range(key_num):
        key = create_key(key_len)
        if key not in keys:
            keys.append(key)
    return keys

0

Tất cả các câu trả lời trước đều đúng, nếu bạn đang tìm kiếm các ký tự ngẫu nhiên thuộc nhiều loại khác nhau (ví dụ như chữ và số và ký tự đặc biệt) thì đây là tập lệnh mà tôi đã tạo để thể hiện các loại tạo hàm ngẫu nhiên khác nhau, nó có ba hàm một cho các số, alpha- nhân vật và nhân vật đặc biệt. Kịch bản chỉ đơn giản là tạo mật khẩu và chỉ là một ví dụ để thể hiện nhiều cách tạo ký tự ngẫu nhiên khác nhau.

import string
import random
import sys

#make sure it's 3.7 or above
print(sys.version)

def create_str(str_length):
    return random.sample(string.ascii_letters, str_length)

def create_num(num_length):
    digits = []
    for i in range(num_length):
        digits.append(str(random.randint(1, 100)))

    return digits

def create_special_chars(special_length):
    stringSpecial = []
    for i in range(special_length):
        stringSpecial.append(random.choice('!$%&()*+,-.:;<=>?@[]^_`{|}~'))

    return stringSpecial

print("how many characters would you like to use ? (DO NOT USE LESS THAN 8)")
str_cnt = input()
print("how many digits would you like to use ? (DO NOT USE LESS THAN 2)")
num_cnt = input()
print("how many special characters would you like to use ? (DO NOT USE LESS THAN 1)")
s_chars_cnt = input()
password_values = create_str(int(str_cnt)) +create_num(int(num_cnt)) + create_special_chars(int(s_chars_cnt))

#shuffle/mix the values
random.shuffle(password_values)

print("generated password is: ")
print(''.join(password_values))

Kết quả:

nhập mô tả hình ảnh ở đây


-1

tốt, đây là câu trả lời của tôi Nó hoạt động tốt. Chỉ cần đặt số lượng chữ cái ngẫu nhiên bạn muốn vào 'số' ... (Python 3)

import random

def key_gen():
    keylist = random.choice('abcdefghijklmnopqrstuvwxyz')
    return keylist

number = 0
list_item = ''
while number < 20:
    number = number + 1
    list_item = list_item + key_gen()

print(list_item)

-1
import string
import random

def random_char(y):
    return ''.join(random.choice(string.ascii_letters+string.digits+li) for x in range(y))
no=int(input("Enter the number of character for your password=  "))
li = random.choice('!@#$%^*&( )_+}{')
print(random_char(no)+li)

-1

Đoạn mã quá phức tạp của tôi:

import random

letter = (random.randint(1,26))
if letter == 1:
   print ('a')
elif letter == 2:
    print ('b')
elif letter == 3:
    print ('c')
elif letter == 4:
    print ('d')
elif letter == 5:
    print ('e')
elif letter == 6:
    print ('f')
elif letter == 7:
    print ('g')
elif letter == 8:
    print ('h')
elif letter == 9:
    print ('i')
elif letter == 10:
    print ('j')
elif letter == 11:
    print ('k')
elif letter == 12:
    print ('l')
elif letter == 13:
    print ('m')
elif letter == 14:
    print ('n')
elif letter == 15:
    print ('o')
elif letter == 16:
    print ('p')
elif letter == 17:
    print ('q')
elif letter == 18:
    print ('r')
elif letter == 19:
    print ('s')
elif letter == 20:
    print ('t')
elif letter == 21:
    print ('u')
elif letter == 22:
    print ('v')
elif letter == 23:
    print ('w')
elif letter == 24:
    print ('x')
elif letter == 25:
    print ('y')
elif letter == 26:
    print ('z')

Về cơ bản, nó tạo ra một số ngẫu nhiên trong số 26 và sau đó chuyển đổi thành chữ cái tương ứng. Điều này có thể được cải thiện một cách thách thức nhưng tôi chỉ là người mới bắt đầu và tôi tự hào về đoạn mã này.


4
câu trả lời của bạn cần cải thiện và không phải là rất chức năng.
grepit

1
trong trường hợp của bạn, bạn có thể làm một cách đơn giản print(chr(96 + letter)), không if- elifđịa ngục là cần thiết
Azat Ibrakov

-3

Có lẽ điều này có thể giúp bạn:

import random
for a in range(64,90):
    h = random.randint(64, a)
    e += chr(h)
print e

Tại sao bạn lặp lại giữa 64 và 90? Tại sao không đi từ 0 đến 26, và bù a? Câu trả lời này khá kém, đầu ra hầu như không ngẫu nhiên:@AAADCCEHFGJLDJF@EHFMHKWUR
Matt M.

-6

Đặt một con trăn trên bàn phím và để anh ta cuộn các chữ cái cho đến khi bạn tìm thấy kết hợp ngẫu nhiên ưa thích của bạn Chỉ đùa thôi!

import string #This was a design above but failed to print. I remodled it.
import random
irandom = random.choice(string.ascii_letters) 
print irandom

2
Chào mừng bạn đến với Stack Overflow! Mặc dù đây là một câu trả lời hay, nó giống hệt với câu trả lời đã được đăng và chấp nhận bởi @MarkRushakoff, đã trả lời hai năm trước. Vui lòng xem lại các câu trả lời trước khi bạn đăng để chúng tôi có thể giảm tỷ lệ nhiễu tín hiệu.
Móc vào
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.