在Python中生成随机字母

198

有没有办法在Python中生成随机字母(类似于random.randint但是生成字母)?像random.randint的范围功能很好,但如果有一个仅输出随机字母的生成器会更好。

24个回答

335

简单:

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

string.ascii_letters 返回一个包含当前语言环境下大小写字母的字符串。

random.choice 从序列中随机返回一个元素。


14
实际上是string.ascii_lowercase或string.ascii_uppercase。 - Taylor Leese
11
经常需要一个随机字符串,这是生成方法(在导入ascii_lettersdigits后,再从random中导入choice函数):''.join([choice(ascii_letters + digits) for i in range(32)]) - Devin
7
@joaquin string.letters 在 Python 2.7.7 中可用。 - Wilson Canda

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

这可以是小写或大写。不确定是否需要这样。 - Taylor Leese
9
@TaylorLeese,我知道有三个选项,包括ascii_lettersascii_uppercaseascii_lowercase - Uvuvwevwevwe

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

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

生成y个随机字符


11
也可以写成:''.join(random.sample(string.ascii_lowercase,5)),意思是从小写字母表中随机抽样5个字符并将它们连接起来。 - Dannid
@Dannid 不是random.sample()从输入中返回一个唯一的值集,这与random.choice()不同吗? - Droppy
是的,尽管如果您只选择一个字母,这并没有什么区别。此外,您可能希望有5个不同的字母 - OP没有指定,并且random.choicerandom.randint都返回单个值。您还可以使用numpy.random.choice来提供一个唯一的集合,如果您添加了replace=False,就像这样:numpy.random.choice(string.ascii_lowercase, size=5, replace=False) - Dannid
哦,还有y没有定义。要小心。 - colappse
@colappse y 是传递给函数的参数。 - Saad
@saad 好的,我明白你的意思。 - colappse

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

21

你可以使用这个来获得一个或多个随机字母。

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 random.choices 的分布是什么? - Sal-laS
@SalmanLashkarara help(random.choices) 表示:如果没有指定相对权重或累积权重,则选择是等概率的。这意味着分布是离散均匀分布(https://en.wikipedia.org/wiki/Discrete_uniform_distribution)。 - Qaswed

15

为了完整性另一种方法:

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

利用ASCII字母表中'a'的编码为97,以及字母表中有26个字母的事实。

在确定random.randrange()函数调用的下限和上限时,请记住random.randrange()对其上限是排除的,这意味着它只会生成比提供的值小1的整数。


3
那就要看我们正在谈论哪种字母表了 ;-) - Joey
难道不应该是 chr(random.randrange(97, 97 + 26 - 1)) 吗? - zhongxiao37
1
@zhongxiao37 实际上应该是 chr(random.randrange(97, 97 + 26)random.randrange() 的上限是不包含的,这意味着为了获得字符范围 97-122 的所有字符,传递的参数必须是 123 - Kieran Moynihan
@KieranMoynihan 谢谢分享。我仔细检查了一下,你说得对。现在我明白为什么要使用 97 + 26 了。 - zhongxiao37

6
你可以简单地列一个清单:
import random
list1=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
b=random.randint(0,7)
print(list1[b])

6

这并不使用任何花哨的模块,但能很好地工作:

    ''.join(chr(random.randrange(65,90)) for i in range(10))

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接